tapps-agents 3.5.40__py3-none-any.whl → 3.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -219
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2196
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -111
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.40.dist-info/RECORD +0 -760
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,148 +1,148 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Security posture evaluator.
|
|
3
|
-
|
|
4
|
-
Extends beyond vulnerability scanning to security pattern compliance and best practices.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import logging
|
|
8
|
-
import re
|
|
9
|
-
from pathlib import Path
|
|
10
|
-
from typing import Any
|
|
11
|
-
|
|
12
|
-
from ..evaluation_base import BaseEvaluator
|
|
13
|
-
from ..evaluation_models import Issue, IssueCategory, IssueManifest, IssueSeverity
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger(__name__)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class SecurityPostureEvaluator(BaseEvaluator):
|
|
19
|
-
"""
|
|
20
|
-
Evaluator for comprehensive security posture assessment.
|
|
21
|
-
|
|
22
|
-
Checks security patterns, best practices, and potential vulnerabilities.
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
-
def __init__(self):
|
|
26
|
-
"""Initialize security posture evaluator."""
|
|
27
|
-
# Common insecure patterns
|
|
28
|
-
self.insecure_patterns = [
|
|
29
|
-
(r'eval\s*\(', "Use of eval() can execute arbitrary code"),
|
|
30
|
-
(r'exec\s*\(', "Use of exec() can execute arbitrary code"),
|
|
31
|
-
(r'__import__\s*\(', "Dynamic imports can be security risks"),
|
|
32
|
-
(r'pickle\.loads\s*\(', "Unpickling untrusted data can execute code"),
|
|
33
|
-
(r'subprocess\.call\s*\(', "Command injection risk"),
|
|
34
|
-
(r'os\.system\s*\(', "Command injection risk"),
|
|
35
|
-
(r'password\s*=\s*["\'].*["\']', "Hardcoded password"),
|
|
36
|
-
(r'api_key\s*=\s*["\'].*["\']', "Hardcoded API key"),
|
|
37
|
-
(r'secret\s*=\s*["\'].*["\']', "Hardcoded secret"),
|
|
38
|
-
]
|
|
39
|
-
|
|
40
|
-
def get_name(self) -> str:
|
|
41
|
-
"""Get evaluator name."""
|
|
42
|
-
return "security_posture"
|
|
43
|
-
|
|
44
|
-
def is_applicable(self, target: Path | str) -> bool:
|
|
45
|
-
"""Applicable to code files."""
|
|
46
|
-
target_path = Path(target) if isinstance(target, str) else target
|
|
47
|
-
return target_path.suffix in [".py", ".js", ".ts", ".tsx", ".jsx"]
|
|
48
|
-
|
|
49
|
-
def evaluate(
|
|
50
|
-
self, target: Path | str, context: dict[str, Any] | None = None
|
|
51
|
-
) -> IssueManifest:
|
|
52
|
-
"""
|
|
53
|
-
Evaluate security posture.
|
|
54
|
-
|
|
55
|
-
Args:
|
|
56
|
-
target: File path to evaluate
|
|
57
|
-
context: Optional context
|
|
58
|
-
|
|
59
|
-
Returns:
|
|
60
|
-
IssueManifest with security issues found
|
|
61
|
-
"""
|
|
62
|
-
target_path = Path(target) if isinstance(target, str) else target
|
|
63
|
-
issues = IssueManifest()
|
|
64
|
-
|
|
65
|
-
if not target_path.exists() or not target_path.is_file():
|
|
66
|
-
return issues
|
|
67
|
-
|
|
68
|
-
try:
|
|
69
|
-
code = target_path.read_text(encoding="utf-8")
|
|
70
|
-
|
|
71
|
-
# Check insecure patterns
|
|
72
|
-
for pattern, description in self.insecure_patterns:
|
|
73
|
-
matches = list(re.finditer(pattern, code, re.IGNORECASE))
|
|
74
|
-
for match in matches:
|
|
75
|
-
line_num = code[:match.start()].count("\n") + 1
|
|
76
|
-
|
|
77
|
-
# Determine severity based on pattern
|
|
78
|
-
severity = IssueSeverity.CRITICAL if "eval" in pattern or "exec" in pattern or "pickle" in pattern else IssueSeverity.HIGH
|
|
79
|
-
|
|
80
|
-
issue = Issue(
|
|
81
|
-
id=f"security_pattern_{pattern[:10]}_{line_num}",
|
|
82
|
-
severity=severity,
|
|
83
|
-
category=IssueCategory.SECURITY,
|
|
84
|
-
evidence=f"Security risk detected: {description}",
|
|
85
|
-
repro=f"Inspect line {line_num} in {target_path}",
|
|
86
|
-
suggested_fix=f"Remove or secure: {match.group(0)} - {description}",
|
|
87
|
-
owner_step="implementation",
|
|
88
|
-
file_path=str(target_path),
|
|
89
|
-
line_number=line_num,
|
|
90
|
-
)
|
|
91
|
-
issues.add_issue(issue)
|
|
92
|
-
|
|
93
|
-
# Check for missing input validation
|
|
94
|
-
validation_issues = self._check_input_validation(code, target_path)
|
|
95
|
-
issues = issues.merge(validation_issues)
|
|
96
|
-
|
|
97
|
-
except Exception as e:
|
|
98
|
-
logger.warning(f"Error in security posture evaluation: {e}")
|
|
99
|
-
|
|
100
|
-
return issues
|
|
101
|
-
|
|
102
|
-
def _check_input_validation(
|
|
103
|
-
self, code: str, file_path: Path
|
|
104
|
-
) -> IssueManifest:
|
|
105
|
-
"""Check for missing input validation."""
|
|
106
|
-
issues = IssueManifest()
|
|
107
|
-
|
|
108
|
-
# Simple heuristic: look for functions that accept user input but don't validate
|
|
109
|
-
# This is a simplified check - full analysis would require AST parsing
|
|
110
|
-
if "def " in code and "input(" in code:
|
|
111
|
-
# Check if input() calls have validation nearby
|
|
112
|
-
input_pattern = r'input\s*\('
|
|
113
|
-
validation_patterns = [
|
|
114
|
-
r'if\s+.*:\s*raise',
|
|
115
|
-
r'assert\s+',
|
|
116
|
-
r'validate',
|
|
117
|
-
r'\.isnumeric\(\)',
|
|
118
|
-
r'\.isdigit\(\)',
|
|
119
|
-
]
|
|
120
|
-
|
|
121
|
-
input_matches = list(re.finditer(input_pattern, code))
|
|
122
|
-
for match in input_matches:
|
|
123
|
-
# Check next 20 lines for validation
|
|
124
|
-
start_pos = match.start()
|
|
125
|
-
next_lines = code[start_pos:start_pos + 1000]
|
|
126
|
-
|
|
127
|
-
has_validation = any(
|
|
128
|
-
re.search(pattern, next_lines, re.IGNORECASE)
|
|
129
|
-
for pattern in validation_patterns
|
|
130
|
-
)
|
|
131
|
-
|
|
132
|
-
if not has_validation:
|
|
133
|
-
line_num = code[:start_pos].count("\n") + 1
|
|
134
|
-
issue = Issue(
|
|
135
|
-
id=f"security_missing_validation_{line_num}",
|
|
136
|
-
severity=IssueSeverity.MEDIUM,
|
|
137
|
-
category=IssueCategory.SECURITY,
|
|
138
|
-
evidence=f"Potential missing input validation at line {line_num}",
|
|
139
|
-
repro=f"Check input validation in {file_path} around line {line_num}",
|
|
140
|
-
suggested_fix="Add input validation and sanitization",
|
|
141
|
-
owner_step="implementation",
|
|
142
|
-
file_path=str(file_path),
|
|
143
|
-
line_number=line_num,
|
|
144
|
-
)
|
|
145
|
-
issues.add_issue(issue)
|
|
146
|
-
|
|
147
|
-
return issues
|
|
148
|
-
|
|
1
|
+
"""
|
|
2
|
+
Security posture evaluator.
|
|
3
|
+
|
|
4
|
+
Extends beyond vulnerability scanning to security pattern compliance and best practices.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import re
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from ..evaluation_base import BaseEvaluator
|
|
13
|
+
from ..evaluation_models import Issue, IssueCategory, IssueManifest, IssueSeverity
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SecurityPostureEvaluator(BaseEvaluator):
|
|
19
|
+
"""
|
|
20
|
+
Evaluator for comprehensive security posture assessment.
|
|
21
|
+
|
|
22
|
+
Checks security patterns, best practices, and potential vulnerabilities.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
"""Initialize security posture evaluator."""
|
|
27
|
+
# Common insecure patterns
|
|
28
|
+
self.insecure_patterns = [
|
|
29
|
+
(r'eval\s*\(', "Use of eval() can execute arbitrary code"),
|
|
30
|
+
(r'exec\s*\(', "Use of exec() can execute arbitrary code"),
|
|
31
|
+
(r'__import__\s*\(', "Dynamic imports can be security risks"),
|
|
32
|
+
(r'pickle\.loads\s*\(', "Unpickling untrusted data can execute code"),
|
|
33
|
+
(r'subprocess\.call\s*\(', "Command injection risk"),
|
|
34
|
+
(r'os\.system\s*\(', "Command injection risk"),
|
|
35
|
+
(r'password\s*=\s*["\'].*["\']', "Hardcoded password"),
|
|
36
|
+
(r'api_key\s*=\s*["\'].*["\']', "Hardcoded API key"),
|
|
37
|
+
(r'secret\s*=\s*["\'].*["\']', "Hardcoded secret"),
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
def get_name(self) -> str:
|
|
41
|
+
"""Get evaluator name."""
|
|
42
|
+
return "security_posture"
|
|
43
|
+
|
|
44
|
+
def is_applicable(self, target: Path | str) -> bool:
|
|
45
|
+
"""Applicable to code files."""
|
|
46
|
+
target_path = Path(target) if isinstance(target, str) else target
|
|
47
|
+
return target_path.suffix in [".py", ".js", ".ts", ".tsx", ".jsx"]
|
|
48
|
+
|
|
49
|
+
def evaluate(
|
|
50
|
+
self, target: Path | str, context: dict[str, Any] | None = None
|
|
51
|
+
) -> IssueManifest:
|
|
52
|
+
"""
|
|
53
|
+
Evaluate security posture.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
target: File path to evaluate
|
|
57
|
+
context: Optional context
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
IssueManifest with security issues found
|
|
61
|
+
"""
|
|
62
|
+
target_path = Path(target) if isinstance(target, str) else target
|
|
63
|
+
issues = IssueManifest()
|
|
64
|
+
|
|
65
|
+
if not target_path.exists() or not target_path.is_file():
|
|
66
|
+
return issues
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
code = target_path.read_text(encoding="utf-8")
|
|
70
|
+
|
|
71
|
+
# Check insecure patterns
|
|
72
|
+
for pattern, description in self.insecure_patterns:
|
|
73
|
+
matches = list(re.finditer(pattern, code, re.IGNORECASE))
|
|
74
|
+
for match in matches:
|
|
75
|
+
line_num = code[:match.start()].count("\n") + 1
|
|
76
|
+
|
|
77
|
+
# Determine severity based on pattern
|
|
78
|
+
severity = IssueSeverity.CRITICAL if "eval" in pattern or "exec" in pattern or "pickle" in pattern else IssueSeverity.HIGH
|
|
79
|
+
|
|
80
|
+
issue = Issue(
|
|
81
|
+
id=f"security_pattern_{pattern[:10]}_{line_num}",
|
|
82
|
+
severity=severity,
|
|
83
|
+
category=IssueCategory.SECURITY,
|
|
84
|
+
evidence=f"Security risk detected: {description}",
|
|
85
|
+
repro=f"Inspect line {line_num} in {target_path}",
|
|
86
|
+
suggested_fix=f"Remove or secure: {match.group(0)} - {description}",
|
|
87
|
+
owner_step="implementation",
|
|
88
|
+
file_path=str(target_path),
|
|
89
|
+
line_number=line_num,
|
|
90
|
+
)
|
|
91
|
+
issues.add_issue(issue)
|
|
92
|
+
|
|
93
|
+
# Check for missing input validation
|
|
94
|
+
validation_issues = self._check_input_validation(code, target_path)
|
|
95
|
+
issues = issues.merge(validation_issues)
|
|
96
|
+
|
|
97
|
+
except Exception as e:
|
|
98
|
+
logger.warning(f"Error in security posture evaluation: {e}")
|
|
99
|
+
|
|
100
|
+
return issues
|
|
101
|
+
|
|
102
|
+
def _check_input_validation(
|
|
103
|
+
self, code: str, file_path: Path
|
|
104
|
+
) -> IssueManifest:
|
|
105
|
+
"""Check for missing input validation."""
|
|
106
|
+
issues = IssueManifest()
|
|
107
|
+
|
|
108
|
+
# Simple heuristic: look for functions that accept user input but don't validate
|
|
109
|
+
# This is a simplified check - full analysis would require AST parsing
|
|
110
|
+
if "def " in code and "input(" in code:
|
|
111
|
+
# Check if input() calls have validation nearby
|
|
112
|
+
input_pattern = r'input\s*\('
|
|
113
|
+
validation_patterns = [
|
|
114
|
+
r'if\s+.*:\s*raise',
|
|
115
|
+
r'assert\s+',
|
|
116
|
+
r'validate',
|
|
117
|
+
r'\.isnumeric\(\)',
|
|
118
|
+
r'\.isdigit\(\)',
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
input_matches = list(re.finditer(input_pattern, code))
|
|
122
|
+
for match in input_matches:
|
|
123
|
+
# Check next 20 lines for validation
|
|
124
|
+
start_pos = match.start()
|
|
125
|
+
next_lines = code[start_pos:start_pos + 1000]
|
|
126
|
+
|
|
127
|
+
has_validation = any(
|
|
128
|
+
re.search(pattern, next_lines, re.IGNORECASE)
|
|
129
|
+
for pattern in validation_patterns
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
if not has_validation:
|
|
133
|
+
line_num = code[:start_pos].count("\n") + 1
|
|
134
|
+
issue = Issue(
|
|
135
|
+
id=f"security_missing_validation_{line_num}",
|
|
136
|
+
severity=IssueSeverity.MEDIUM,
|
|
137
|
+
category=IssueCategory.SECURITY,
|
|
138
|
+
evidence=f"Potential missing input validation at line {line_num}",
|
|
139
|
+
repro=f"Check input validation in {file_path} around line {line_num}",
|
|
140
|
+
suggested_fix="Add input validation and sanitization",
|
|
141
|
+
owner_step="implementation",
|
|
142
|
+
file_path=str(file_path),
|
|
143
|
+
line_number=line_num,
|
|
144
|
+
)
|
|
145
|
+
issues.add_issue(issue)
|
|
146
|
+
|
|
147
|
+
return issues
|
|
148
|
+
|
|
@@ -1,181 +1,181 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Specification compliance evaluator.
|
|
3
|
-
|
|
4
|
-
Validates that code matches requirements/stories and acceptance criteria.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import logging
|
|
8
|
-
from pathlib import Path
|
|
9
|
-
from typing import Any
|
|
10
|
-
|
|
11
|
-
from ..evaluation_base import BaseEvaluator
|
|
12
|
-
from ..evaluation_models import Issue, IssueCategory, IssueManifest, IssueSeverity
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class SpecComplianceEvaluator(BaseEvaluator):
|
|
18
|
-
"""
|
|
19
|
-
Evaluator for specification compliance checking.
|
|
20
|
-
|
|
21
|
-
Validates requirements/stories traceability and acceptance criteria coverage.
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
|
-
def __init__(self, workflow_state: dict[str, Any] | None = None):
|
|
25
|
-
"""
|
|
26
|
-
Initialize spec compliance evaluator.
|
|
27
|
-
|
|
28
|
-
Args:
|
|
29
|
-
workflow_state: Optional workflow state for requirements/stories access
|
|
30
|
-
"""
|
|
31
|
-
self.workflow_state = workflow_state or {}
|
|
32
|
-
|
|
33
|
-
def get_name(self) -> str:
|
|
34
|
-
"""Get evaluator name."""
|
|
35
|
-
return "spec_compliance"
|
|
36
|
-
|
|
37
|
-
def is_applicable(self, target: Path | str) -> bool:
|
|
38
|
-
"""Always applicable (can check against any target)."""
|
|
39
|
-
return True
|
|
40
|
-
|
|
41
|
-
def evaluate(
|
|
42
|
-
self, target: Path | str, context: dict[str, Any] | None = None
|
|
43
|
-
) -> IssueManifest:
|
|
44
|
-
"""
|
|
45
|
-
Evaluate specification compliance.
|
|
46
|
-
|
|
47
|
-
Args:
|
|
48
|
-
target: File path or identifier to evaluate
|
|
49
|
-
context: Optional context (requirements, stories, expected behavior)
|
|
50
|
-
|
|
51
|
-
Returns:
|
|
52
|
-
IssueManifest with compliance issues found
|
|
53
|
-
"""
|
|
54
|
-
issues = IssueManifest()
|
|
55
|
-
|
|
56
|
-
# Get requirements and stories from context or workflow state
|
|
57
|
-
requirements = (context or {}).get("requirements", [])
|
|
58
|
-
stories = (context or {}).get("stories", [])
|
|
59
|
-
|
|
60
|
-
# If workflow state available, extract from there
|
|
61
|
-
if self.workflow_state:
|
|
62
|
-
requirements = self.workflow_state.get("requirements", requirements)
|
|
63
|
-
stories = self.workflow_state.get("stories", stories)
|
|
64
|
-
|
|
65
|
-
# Validate traceability
|
|
66
|
-
if requirements:
|
|
67
|
-
issues = self._check_requirements_traceability(
|
|
68
|
-
target, requirements, context
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
if stories:
|
|
72
|
-
story_issues = self._check_stories_coverage(target, stories, context)
|
|
73
|
-
issues = issues.merge(story_issues)
|
|
74
|
-
|
|
75
|
-
return issues
|
|
76
|
-
|
|
77
|
-
def _check_requirements_traceability(
|
|
78
|
-
self,
|
|
79
|
-
target: Path | str,
|
|
80
|
-
requirements: list[dict[str, Any]],
|
|
81
|
-
context: dict[str, Any] | None,
|
|
82
|
-
) -> IssueManifest:
|
|
83
|
-
"""Check if code traces back to requirements."""
|
|
84
|
-
issues = IssueManifest()
|
|
85
|
-
target_path = Path(target) if isinstance(target, str) else target
|
|
86
|
-
|
|
87
|
-
# Read code to check for requirement references
|
|
88
|
-
if target_path.exists() and target_path.is_file():
|
|
89
|
-
try:
|
|
90
|
-
code = target_path.read_text(encoding="utf-8")
|
|
91
|
-
|
|
92
|
-
# Check if requirements are mentioned in code/comments
|
|
93
|
-
for req in requirements:
|
|
94
|
-
req_id = req.get("id", "")
|
|
95
|
-
req_description = req.get("description", "")
|
|
96
|
-
|
|
97
|
-
# Look for requirement ID in code
|
|
98
|
-
if req_id and req_id not in code:
|
|
99
|
-
# Check if requirement is in comments
|
|
100
|
-
in_comments = any(
|
|
101
|
-
req_id in line or req_description[:50] in line
|
|
102
|
-
for line in code.splitlines()
|
|
103
|
-
if line.strip().startswith("#")
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
if not in_comments:
|
|
107
|
-
issue = Issue(
|
|
108
|
-
id=f"spec_missing_traceability_{req_id}",
|
|
109
|
-
severity=IssueSeverity.MEDIUM,
|
|
110
|
-
category=IssueCategory.CORRECTNESS,
|
|
111
|
-
evidence=f"Requirement {req_id} not referenced in code: {req_description[:100]}",
|
|
112
|
-
repro=f"Check if requirement {req_id} is implemented in {target_path}",
|
|
113
|
-
suggested_fix=f"Add requirement reference or implement requirement {req_id}",
|
|
114
|
-
owner_step="implementation",
|
|
115
|
-
file_path=str(target_path),
|
|
116
|
-
traceability={"requirement_id": req_id},
|
|
117
|
-
)
|
|
118
|
-
issues.add_issue(issue)
|
|
119
|
-
|
|
120
|
-
except Exception as e:
|
|
121
|
-
logger.warning(f"Error checking requirements traceability: {e}")
|
|
122
|
-
|
|
123
|
-
return issues
|
|
124
|
-
|
|
125
|
-
def _check_stories_coverage(
|
|
126
|
-
self,
|
|
127
|
-
target: Path | str,
|
|
128
|
-
stories: list[dict[str, Any]],
|
|
129
|
-
context: dict[str, Any] | None,
|
|
130
|
-
) -> IssueManifest:
|
|
131
|
-
"""Check if acceptance criteria are met."""
|
|
132
|
-
issues = IssueManifest()
|
|
133
|
-
target_path = Path(target) if isinstance(target, str) else target
|
|
134
|
-
|
|
135
|
-
# Check acceptance criteria coverage
|
|
136
|
-
for story in stories:
|
|
137
|
-
story_id = story.get("id", "")
|
|
138
|
-
acceptance_criteria = story.get("acceptance_criteria", [])
|
|
139
|
-
|
|
140
|
-
if not acceptance_criteria:
|
|
141
|
-
continue
|
|
142
|
-
|
|
143
|
-
# Simple check: verify acceptance criteria keywords in code
|
|
144
|
-
if target_path.exists() and target_path.is_file():
|
|
145
|
-
try:
|
|
146
|
-
code = target_path.read_text(encoding="utf-8").lower()
|
|
147
|
-
|
|
148
|
-
for criterion in acceptance_criteria:
|
|
149
|
-
criterion_text = criterion.get("description", "").lower()
|
|
150
|
-
# Check if key terms from criterion appear in code
|
|
151
|
-
key_terms = [
|
|
152
|
-
word
|
|
153
|
-
for word in criterion_text.split()
|
|
154
|
-
if len(word) > 4
|
|
155
|
-
]
|
|
156
|
-
|
|
157
|
-
if key_terms:
|
|
158
|
-
found_terms = [
|
|
159
|
-
term for term in key_terms if term in code
|
|
160
|
-
]
|
|
161
|
-
coverage = len(found_terms) / len(key_terms) if key_terms else 0
|
|
162
|
-
|
|
163
|
-
if coverage < 0.5: # Less than 50% coverage
|
|
164
|
-
issue = Issue(
|
|
165
|
-
id=f"spec_low_coverage_{story_id}_{criterion.get('id', '')}",
|
|
166
|
-
severity=IssueSeverity.MEDIUM,
|
|
167
|
-
category=IssueCategory.CORRECTNESS,
|
|
168
|
-
evidence=f"Low coverage for acceptance criteria: {criterion.get('description', '')[:100]}",
|
|
169
|
-
repro=f"Verify acceptance criteria for story {story_id}",
|
|
170
|
-
suggested_fix=f"Implement acceptance criteria or add test coverage",
|
|
171
|
-
owner_step="testing",
|
|
172
|
-
file_path=str(target_path),
|
|
173
|
-
traceability={"story_id": story_id, "criterion_id": criterion.get("id")},
|
|
174
|
-
)
|
|
175
|
-
issues.add_issue(issue)
|
|
176
|
-
|
|
177
|
-
except Exception as e:
|
|
178
|
-
logger.warning(f"Error checking stories coverage: {e}")
|
|
179
|
-
|
|
180
|
-
return issues
|
|
181
|
-
|
|
1
|
+
"""
|
|
2
|
+
Specification compliance evaluator.
|
|
3
|
+
|
|
4
|
+
Validates that code matches requirements/stories and acceptance criteria.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from ..evaluation_base import BaseEvaluator
|
|
12
|
+
from ..evaluation_models import Issue, IssueCategory, IssueManifest, IssueSeverity
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SpecComplianceEvaluator(BaseEvaluator):
|
|
18
|
+
"""
|
|
19
|
+
Evaluator for specification compliance checking.
|
|
20
|
+
|
|
21
|
+
Validates requirements/stories traceability and acceptance criteria coverage.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, workflow_state: dict[str, Any] | None = None):
|
|
25
|
+
"""
|
|
26
|
+
Initialize spec compliance evaluator.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
workflow_state: Optional workflow state for requirements/stories access
|
|
30
|
+
"""
|
|
31
|
+
self.workflow_state = workflow_state or {}
|
|
32
|
+
|
|
33
|
+
def get_name(self) -> str:
|
|
34
|
+
"""Get evaluator name."""
|
|
35
|
+
return "spec_compliance"
|
|
36
|
+
|
|
37
|
+
def is_applicable(self, target: Path | str) -> bool:
|
|
38
|
+
"""Always applicable (can check against any target)."""
|
|
39
|
+
return True
|
|
40
|
+
|
|
41
|
+
def evaluate(
|
|
42
|
+
self, target: Path | str, context: dict[str, Any] | None = None
|
|
43
|
+
) -> IssueManifest:
|
|
44
|
+
"""
|
|
45
|
+
Evaluate specification compliance.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
target: File path or identifier to evaluate
|
|
49
|
+
context: Optional context (requirements, stories, expected behavior)
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
IssueManifest with compliance issues found
|
|
53
|
+
"""
|
|
54
|
+
issues = IssueManifest()
|
|
55
|
+
|
|
56
|
+
# Get requirements and stories from context or workflow state
|
|
57
|
+
requirements = (context or {}).get("requirements", [])
|
|
58
|
+
stories = (context or {}).get("stories", [])
|
|
59
|
+
|
|
60
|
+
# If workflow state available, extract from there
|
|
61
|
+
if self.workflow_state:
|
|
62
|
+
requirements = self.workflow_state.get("requirements", requirements)
|
|
63
|
+
stories = self.workflow_state.get("stories", stories)
|
|
64
|
+
|
|
65
|
+
# Validate traceability
|
|
66
|
+
if requirements:
|
|
67
|
+
issues = self._check_requirements_traceability(
|
|
68
|
+
target, requirements, context
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
if stories:
|
|
72
|
+
story_issues = self._check_stories_coverage(target, stories, context)
|
|
73
|
+
issues = issues.merge(story_issues)
|
|
74
|
+
|
|
75
|
+
return issues
|
|
76
|
+
|
|
77
|
+
def _check_requirements_traceability(
|
|
78
|
+
self,
|
|
79
|
+
target: Path | str,
|
|
80
|
+
requirements: list[dict[str, Any]],
|
|
81
|
+
context: dict[str, Any] | None,
|
|
82
|
+
) -> IssueManifest:
|
|
83
|
+
"""Check if code traces back to requirements."""
|
|
84
|
+
issues = IssueManifest()
|
|
85
|
+
target_path = Path(target) if isinstance(target, str) else target
|
|
86
|
+
|
|
87
|
+
# Read code to check for requirement references
|
|
88
|
+
if target_path.exists() and target_path.is_file():
|
|
89
|
+
try:
|
|
90
|
+
code = target_path.read_text(encoding="utf-8")
|
|
91
|
+
|
|
92
|
+
# Check if requirements are mentioned in code/comments
|
|
93
|
+
for req in requirements:
|
|
94
|
+
req_id = req.get("id", "")
|
|
95
|
+
req_description = req.get("description", "")
|
|
96
|
+
|
|
97
|
+
# Look for requirement ID in code
|
|
98
|
+
if req_id and req_id not in code:
|
|
99
|
+
# Check if requirement is in comments
|
|
100
|
+
in_comments = any(
|
|
101
|
+
req_id in line or req_description[:50] in line
|
|
102
|
+
for line in code.splitlines()
|
|
103
|
+
if line.strip().startswith("#")
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
if not in_comments:
|
|
107
|
+
issue = Issue(
|
|
108
|
+
id=f"spec_missing_traceability_{req_id}",
|
|
109
|
+
severity=IssueSeverity.MEDIUM,
|
|
110
|
+
category=IssueCategory.CORRECTNESS,
|
|
111
|
+
evidence=f"Requirement {req_id} not referenced in code: {req_description[:100]}",
|
|
112
|
+
repro=f"Check if requirement {req_id} is implemented in {target_path}",
|
|
113
|
+
suggested_fix=f"Add requirement reference or implement requirement {req_id}",
|
|
114
|
+
owner_step="implementation",
|
|
115
|
+
file_path=str(target_path),
|
|
116
|
+
traceability={"requirement_id": req_id},
|
|
117
|
+
)
|
|
118
|
+
issues.add_issue(issue)
|
|
119
|
+
|
|
120
|
+
except Exception as e:
|
|
121
|
+
logger.warning(f"Error checking requirements traceability: {e}")
|
|
122
|
+
|
|
123
|
+
return issues
|
|
124
|
+
|
|
125
|
+
def _check_stories_coverage(
|
|
126
|
+
self,
|
|
127
|
+
target: Path | str,
|
|
128
|
+
stories: list[dict[str, Any]],
|
|
129
|
+
context: dict[str, Any] | None,
|
|
130
|
+
) -> IssueManifest:
|
|
131
|
+
"""Check if acceptance criteria are met."""
|
|
132
|
+
issues = IssueManifest()
|
|
133
|
+
target_path = Path(target) if isinstance(target, str) else target
|
|
134
|
+
|
|
135
|
+
# Check acceptance criteria coverage
|
|
136
|
+
for story in stories:
|
|
137
|
+
story_id = story.get("id", "")
|
|
138
|
+
acceptance_criteria = story.get("acceptance_criteria", [])
|
|
139
|
+
|
|
140
|
+
if not acceptance_criteria:
|
|
141
|
+
continue
|
|
142
|
+
|
|
143
|
+
# Simple check: verify acceptance criteria keywords in code
|
|
144
|
+
if target_path.exists() and target_path.is_file():
|
|
145
|
+
try:
|
|
146
|
+
code = target_path.read_text(encoding="utf-8").lower()
|
|
147
|
+
|
|
148
|
+
for criterion in acceptance_criteria:
|
|
149
|
+
criterion_text = criterion.get("description", "").lower()
|
|
150
|
+
# Check if key terms from criterion appear in code
|
|
151
|
+
key_terms = [
|
|
152
|
+
word
|
|
153
|
+
for word in criterion_text.split()
|
|
154
|
+
if len(word) > 4
|
|
155
|
+
]
|
|
156
|
+
|
|
157
|
+
if key_terms:
|
|
158
|
+
found_terms = [
|
|
159
|
+
term for term in key_terms if term in code
|
|
160
|
+
]
|
|
161
|
+
coverage = len(found_terms) / len(key_terms) if key_terms else 0
|
|
162
|
+
|
|
163
|
+
if coverage < 0.5: # Less than 50% coverage
|
|
164
|
+
issue = Issue(
|
|
165
|
+
id=f"spec_low_coverage_{story_id}_{criterion.get('id', '')}",
|
|
166
|
+
severity=IssueSeverity.MEDIUM,
|
|
167
|
+
category=IssueCategory.CORRECTNESS,
|
|
168
|
+
evidence=f"Low coverage for acceptance criteria: {criterion.get('description', '')[:100]}",
|
|
169
|
+
repro=f"Verify acceptance criteria for story {story_id}",
|
|
170
|
+
suggested_fix=f"Implement acceptance criteria or add test coverage",
|
|
171
|
+
owner_step="testing",
|
|
172
|
+
file_path=str(target_path),
|
|
173
|
+
traceability={"story_id": story_id, "criterion_id": criterion.get("id")},
|
|
174
|
+
)
|
|
175
|
+
issues.add_issue(issue)
|
|
176
|
+
|
|
177
|
+
except Exception as e:
|
|
178
|
+
logger.warning(f"Error checking stories coverage: {e}")
|
|
179
|
+
|
|
180
|
+
return issues
|
|
181
|
+
|