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,479 +1,479 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Review Checklists - Structured review checklists for requirements, stories, and architecture.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import logging
|
|
6
|
-
from dataclasses import dataclass, field
|
|
7
|
-
from typing import Any
|
|
8
|
-
|
|
9
|
-
logger = logging.getLogger(__name__)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@dataclass
|
|
13
|
-
class ReviewItem:
|
|
14
|
-
"""A single review checklist item."""
|
|
15
|
-
|
|
16
|
-
category: str
|
|
17
|
-
item: str
|
|
18
|
-
checked: bool = False
|
|
19
|
-
notes: str = ""
|
|
20
|
-
severity: str = "medium" # "critical", "high", "medium", "low"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@dataclass
|
|
24
|
-
class ReviewResult:
|
|
25
|
-
"""Result of a review with checklist scoring."""
|
|
26
|
-
|
|
27
|
-
overall_score: float = 0.0 # 0-100
|
|
28
|
-
items_checked: int = 0
|
|
29
|
-
items_total: int = 0
|
|
30
|
-
critical_issues: list[str] = field(default_factory=list)
|
|
31
|
-
high_issues: list[str] = field(default_factory=list)
|
|
32
|
-
medium_issues: list[str] = field(default_factory=list)
|
|
33
|
-
low_issues: list[str] = field(default_factory=list)
|
|
34
|
-
recommendations: list[str] = field(default_factory=list)
|
|
35
|
-
checklist_items: list[ReviewItem] = field(default_factory=list)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
class RequirementsReviewChecklist:
|
|
39
|
-
"""Review checklist for requirements."""
|
|
40
|
-
|
|
41
|
-
def get_checklist(self) -> list[ReviewItem]:
|
|
42
|
-
"""Get requirements review checklist."""
|
|
43
|
-
return [
|
|
44
|
-
ReviewItem("Completeness", "All functional requirements are documented", severity="critical"),
|
|
45
|
-
ReviewItem("Completeness", "Non-functional requirements (NFRs) are specified", severity="critical"),
|
|
46
|
-
ReviewItem("Completeness", "Technical constraints are identified", severity="high"),
|
|
47
|
-
ReviewItem("Completeness", "Assumptions are documented", severity="medium"),
|
|
48
|
-
ReviewItem("Clarity", "Requirements are unambiguous and clear", severity="critical"),
|
|
49
|
-
ReviewItem("Clarity", "No vague or ambiguous language (maybe, perhaps, could)", severity="high"),
|
|
50
|
-
ReviewItem("Clarity", "Requirements use specific, measurable language", severity="high"),
|
|
51
|
-
ReviewItem("Testability", "Each requirement has acceptance criteria", severity="critical"),
|
|
52
|
-
ReviewItem("Testability", "Requirements are testable/verifiable", severity="high"),
|
|
53
|
-
ReviewItem("Testability", "Success criteria are defined", severity="high"),
|
|
54
|
-
ReviewItem("Traceability", "Requirements are linked to user stories", severity="high"),
|
|
55
|
-
ReviewItem("Traceability", "Requirements can be traced to tests", severity="medium"),
|
|
56
|
-
ReviewItem("Feasibility", "Requirements are technically feasible", severity="high"),
|
|
57
|
-
ReviewItem("Feasibility", "No impossible or unrealistic requirements", severity="critical"),
|
|
58
|
-
ReviewItem("Feasibility", "Technical approach is viable", severity="medium"),
|
|
59
|
-
ReviewItem("Consistency", "No conflicting requirements", severity="critical"),
|
|
60
|
-
ReviewItem("Consistency", "Terminology is consistent throughout", severity="medium"),
|
|
61
|
-
ReviewItem("Prioritization", "Requirements are prioritized", severity="medium"),
|
|
62
|
-
ReviewItem("Prioritization", "Critical requirements are identified", severity="high"),
|
|
63
|
-
]
|
|
64
|
-
|
|
65
|
-
def review(self, requirements: dict[str, Any]) -> ReviewResult:
|
|
66
|
-
"""Review requirements against checklist."""
|
|
67
|
-
checklist = self.get_checklist()
|
|
68
|
-
result = ReviewResult(items_total=len(checklist))
|
|
69
|
-
result.checklist_items = checklist
|
|
70
|
-
|
|
71
|
-
# Evaluate each item
|
|
72
|
-
func_reqs = requirements.get("functional_requirements", [])
|
|
73
|
-
nfr_reqs = requirements.get("non_functional_requirements", [])
|
|
74
|
-
constraints = requirements.get("constraints", [])
|
|
75
|
-
assumptions = requirements.get("assumptions", [])
|
|
76
|
-
|
|
77
|
-
for item in checklist:
|
|
78
|
-
checked = False
|
|
79
|
-
issue = ""
|
|
80
|
-
|
|
81
|
-
if item.category == "Completeness":
|
|
82
|
-
if "functional requirements" in item.item.lower():
|
|
83
|
-
checked = len(func_reqs) > 0
|
|
84
|
-
if not checked:
|
|
85
|
-
issue = "No functional requirements documented"
|
|
86
|
-
elif "non-functional" in item.item.lower():
|
|
87
|
-
checked = len(nfr_reqs) > 0
|
|
88
|
-
if not checked:
|
|
89
|
-
issue = "No non-functional requirements specified"
|
|
90
|
-
elif "constraints" in item.item.lower():
|
|
91
|
-
checked = len(constraints) > 0
|
|
92
|
-
elif "assumptions" in item.item.lower():
|
|
93
|
-
checked = len(assumptions) > 0
|
|
94
|
-
|
|
95
|
-
elif item.category == "Clarity":
|
|
96
|
-
all_text = " ".join(str(r) for r in func_reqs).lower()
|
|
97
|
-
if "unambiguous" in item.item.lower():
|
|
98
|
-
vague_words = ["maybe", "perhaps", "might", "could", "should consider"]
|
|
99
|
-
checked = not any(word in all_text for word in vague_words)
|
|
100
|
-
if not checked:
|
|
101
|
-
issue = "Vague language found in requirements"
|
|
102
|
-
elif "specific" in item.item.lower():
|
|
103
|
-
checked = len(all_text) > 100 # Has substantial content
|
|
104
|
-
if not checked:
|
|
105
|
-
issue = "Requirements lack specificity"
|
|
106
|
-
|
|
107
|
-
elif item.category == "Testability":
|
|
108
|
-
acceptance = requirements.get("acceptance_criteria", [])
|
|
109
|
-
if "acceptance criteria" in item.item.lower():
|
|
110
|
-
checked = len(acceptance) > 0
|
|
111
|
-
if not checked:
|
|
112
|
-
issue = "No acceptance criteria defined"
|
|
113
|
-
elif "testable" in item.item.lower():
|
|
114
|
-
# Check if requirements have testable language
|
|
115
|
-
testable_indicators = ["must", "shall", "will", "should", "validates", "verifies"]
|
|
116
|
-
all_text = " ".join(str(r) for r in func_reqs).lower()
|
|
117
|
-
checked = any(indicator in all_text for indicator in testable_indicators)
|
|
118
|
-
if not checked:
|
|
119
|
-
issue = "Requirements lack testable language"
|
|
120
|
-
|
|
121
|
-
elif item.category == "Traceability":
|
|
122
|
-
# Check for links
|
|
123
|
-
linked_count = 0
|
|
124
|
-
for req in func_reqs:
|
|
125
|
-
if isinstance(req, dict):
|
|
126
|
-
if any(key in req for key in ["story_id", "story_link", "related_stories"]):
|
|
127
|
-
linked_count += 1
|
|
128
|
-
checked = linked_count > 0
|
|
129
|
-
if not checked:
|
|
130
|
-
issue = "Requirements not linked to stories"
|
|
131
|
-
|
|
132
|
-
elif item.category == "Feasibility":
|
|
133
|
-
all_text = " ".join(str(r) for r in func_reqs).lower()
|
|
134
|
-
impossible = ["instantaneous", "zero latency", "infinite", "perfect", "100% uptime"]
|
|
135
|
-
checked = not any(word in all_text for word in impossible)
|
|
136
|
-
if not checked:
|
|
137
|
-
issue = "Impossible requirements detected"
|
|
138
|
-
|
|
139
|
-
elif item.category == "Consistency":
|
|
140
|
-
# Basic consistency check
|
|
141
|
-
checked = True # Would need more sophisticated analysis
|
|
142
|
-
if "conflicting" in item.item.lower():
|
|
143
|
-
# Check for contradictions (simplified)
|
|
144
|
-
checked = True # Placeholder
|
|
145
|
-
|
|
146
|
-
elif item.category == "Prioritization":
|
|
147
|
-
prioritized_count = 0
|
|
148
|
-
for req in func_reqs:
|
|
149
|
-
if isinstance(req, dict):
|
|
150
|
-
if "priority" in req or "importance" in req:
|
|
151
|
-
prioritized_count += 1
|
|
152
|
-
checked = prioritized_count > 0
|
|
153
|
-
if not checked:
|
|
154
|
-
issue = "Requirements not prioritized"
|
|
155
|
-
|
|
156
|
-
item.checked = checked
|
|
157
|
-
if checked:
|
|
158
|
-
result.items_checked += 1
|
|
159
|
-
else:
|
|
160
|
-
if issue:
|
|
161
|
-
if item.severity == "critical":
|
|
162
|
-
result.critical_issues.append(f"{item.category}: {issue}")
|
|
163
|
-
elif item.severity == "high":
|
|
164
|
-
result.high_issues.append(f"{item.category}: {issue}")
|
|
165
|
-
elif item.severity == "medium":
|
|
166
|
-
result.medium_issues.append(f"{item.category}: {issue}")
|
|
167
|
-
else:
|
|
168
|
-
result.low_issues.append(f"{item.category}: {issue}")
|
|
169
|
-
|
|
170
|
-
# Calculate overall score
|
|
171
|
-
if result.items_total > 0:
|
|
172
|
-
result.overall_score = (result.items_checked / result.items_total) * 100.0
|
|
173
|
-
|
|
174
|
-
# Generate recommendations
|
|
175
|
-
if result.critical_issues:
|
|
176
|
-
result.recommendations.append("Address critical issues immediately")
|
|
177
|
-
if result.high_issues:
|
|
178
|
-
result.recommendations.append("Resolve high-priority issues before proceeding")
|
|
179
|
-
if result.overall_score < 70.0:
|
|
180
|
-
result.recommendations.append("Overall score below threshold - review and improve requirements")
|
|
181
|
-
|
|
182
|
-
return result
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
class StoryReviewChecklist:
|
|
186
|
-
"""Review checklist for user stories."""
|
|
187
|
-
|
|
188
|
-
def get_checklist(self) -> list[ReviewItem]:
|
|
189
|
-
"""Get story review checklist (INVEST-based)."""
|
|
190
|
-
return [
|
|
191
|
-
ReviewItem("INVEST", "Story is Independent (can be developed standalone)", severity="high"),
|
|
192
|
-
ReviewItem("INVEST", "Story is Negotiable (details can be discussed)", severity="medium"),
|
|
193
|
-
ReviewItem("INVEST", "Story is Valuable (delivers user/business value)", severity="critical"),
|
|
194
|
-
ReviewItem("INVEST", "Story is Estimable (can be sized)", severity="high"),
|
|
195
|
-
ReviewItem("INVEST", "Story is Small (appropriately sized)", severity="high"),
|
|
196
|
-
ReviewItem("INVEST", "Story is Testable (has clear acceptance criteria)", severity="critical"),
|
|
197
|
-
ReviewItem("Format", "Story follows 'As a... I want... So that...' format", severity="high"),
|
|
198
|
-
ReviewItem("Format", "Story has clear title", severity="medium"),
|
|
199
|
-
ReviewItem("Acceptance Criteria", "At least 2-3 acceptance criteria defined", severity="critical"),
|
|
200
|
-
ReviewItem("Acceptance Criteria", "Acceptance criteria are testable", severity="high"),
|
|
201
|
-
ReviewItem("Acceptance Criteria", "Acceptance criteria use Given-When-Then format", severity="medium"),
|
|
202
|
-
ReviewItem("Dependencies", "Dependencies are identified", severity="high"),
|
|
203
|
-
ReviewItem("Dependencies", "Story has minimal dependencies (< 3)", severity="medium"),
|
|
204
|
-
ReviewItem("Estimation", "Story points assigned (Fibonacci: 1, 2, 3, 5, 8, 13)", severity="high"),
|
|
205
|
-
ReviewItem("Estimation", "Story points are reasonable for scope", severity="medium"),
|
|
206
|
-
ReviewItem("Value", "'So that...' clause clearly states value", severity="critical"),
|
|
207
|
-
ReviewItem("Value", "Story aligns with business goals", severity="medium"),
|
|
208
|
-
]
|
|
209
|
-
|
|
210
|
-
def review(self, story: dict[str, Any]) -> ReviewResult:
|
|
211
|
-
"""Review story against checklist."""
|
|
212
|
-
checklist = self.get_checklist()
|
|
213
|
-
result = ReviewResult(items_total=len(checklist))
|
|
214
|
-
result.checklist_items = checklist
|
|
215
|
-
|
|
216
|
-
description = story.get("description", "")
|
|
217
|
-
acceptance = story.get("acceptance_criteria", [])
|
|
218
|
-
dependencies = story.get("dependencies", [])
|
|
219
|
-
story_points = story.get("story_points", 0)
|
|
220
|
-
|
|
221
|
-
for item in checklist:
|
|
222
|
-
checked = False
|
|
223
|
-
issue = ""
|
|
224
|
-
|
|
225
|
-
if item.category == "INVEST":
|
|
226
|
-
if "Independent" in item.item:
|
|
227
|
-
checked = len(dependencies) <= 2
|
|
228
|
-
if not checked:
|
|
229
|
-
issue = f"Too many dependencies ({len(dependencies)})"
|
|
230
|
-
elif "Negotiable" in item.item:
|
|
231
|
-
prescriptive = ["must", "shall", "exactly", "precisely"]
|
|
232
|
-
checked = not any(word in description.lower() for word in prescriptive)
|
|
233
|
-
if not checked:
|
|
234
|
-
issue = "Story is too prescriptive"
|
|
235
|
-
elif "Valuable" in item.item:
|
|
236
|
-
checked = "so that" in description.lower()
|
|
237
|
-
if not checked:
|
|
238
|
-
issue = "Missing 'So that...' value clause"
|
|
239
|
-
elif "Estimable" in item.item:
|
|
240
|
-
checked = story_points > 0
|
|
241
|
-
if not checked:
|
|
242
|
-
issue = "No story points assigned"
|
|
243
|
-
elif "Small" in item.item:
|
|
244
|
-
checked = 1 <= story_points <= 8
|
|
245
|
-
if not checked:
|
|
246
|
-
issue = f"Story too large ({story_points} points)"
|
|
247
|
-
elif "Testable" in item.item:
|
|
248
|
-
checked = len(acceptance) >= 2
|
|
249
|
-
if not checked:
|
|
250
|
-
issue = "Insufficient acceptance criteria"
|
|
251
|
-
|
|
252
|
-
elif item.category == "Format":
|
|
253
|
-
if "As a" in item.item:
|
|
254
|
-
checked = "as a" in description.lower() and "i want" in description.lower()
|
|
255
|
-
if not checked:
|
|
256
|
-
issue = "Story doesn't follow standard format"
|
|
257
|
-
elif "title" in item.item.lower():
|
|
258
|
-
checked = bool(story.get("title"))
|
|
259
|
-
if not checked:
|
|
260
|
-
issue = "Story missing title"
|
|
261
|
-
|
|
262
|
-
elif item.category == "Acceptance Criteria":
|
|
263
|
-
if "2-3" in item.item:
|
|
264
|
-
checked = 2 <= len(acceptance) <= 7
|
|
265
|
-
if not checked:
|
|
266
|
-
issue = f"Acceptance criteria count: {len(acceptance)} (expected 2-7)"
|
|
267
|
-
elif "testable" in item.item.lower():
|
|
268
|
-
testable_count = sum(1 for ac in acceptance if self._is_testable(ac))
|
|
269
|
-
checked = testable_count > 0
|
|
270
|
-
if not checked:
|
|
271
|
-
issue = "Acceptance criteria not testable"
|
|
272
|
-
elif "Given-When-Then" in item.item:
|
|
273
|
-
gwt_count = sum(1 for ac in acceptance if self._has_gwt_format(ac))
|
|
274
|
-
checked = gwt_count > 0
|
|
275
|
-
if not checked:
|
|
276
|
-
issue = "Acceptance criteria should use Given-When-Then format"
|
|
277
|
-
|
|
278
|
-
elif item.category == "Dependencies":
|
|
279
|
-
if "identified" in item.item.lower():
|
|
280
|
-
checked = True # Dependencies list exists
|
|
281
|
-
elif "minimal" in item.item.lower():
|
|
282
|
-
checked = len(dependencies) < 3
|
|
283
|
-
if not checked:
|
|
284
|
-
issue = f"Too many dependencies: {len(dependencies)}"
|
|
285
|
-
|
|
286
|
-
elif item.category == "Estimation":
|
|
287
|
-
if "assigned" in item.item.lower():
|
|
288
|
-
checked = story_points > 0
|
|
289
|
-
if not checked:
|
|
290
|
-
issue = "Story points not assigned"
|
|
291
|
-
elif "reasonable" in item.item.lower():
|
|
292
|
-
checked = 1 <= story_points <= 13
|
|
293
|
-
if not checked:
|
|
294
|
-
issue = f"Story points out of range: {story_points}"
|
|
295
|
-
|
|
296
|
-
elif item.category == "Value":
|
|
297
|
-
if "So that" in item.item:
|
|
298
|
-
checked = "so that" in description.lower()
|
|
299
|
-
if not checked:
|
|
300
|
-
issue = "Missing value statement ('So that...')"
|
|
301
|
-
|
|
302
|
-
item.checked = checked
|
|
303
|
-
if checked:
|
|
304
|
-
result.items_checked += 1
|
|
305
|
-
else:
|
|
306
|
-
if issue:
|
|
307
|
-
if item.severity == "critical":
|
|
308
|
-
result.critical_issues.append(f"{item.category}: {issue}")
|
|
309
|
-
elif item.severity == "high":
|
|
310
|
-
result.high_issues.append(f"{item.category}: {issue}")
|
|
311
|
-
elif item.severity == "medium":
|
|
312
|
-
result.medium_issues.append(f"{item.category}: {issue}")
|
|
313
|
-
else:
|
|
314
|
-
result.low_issues.append(f"{item.category}: {issue}")
|
|
315
|
-
|
|
316
|
-
# Calculate overall score
|
|
317
|
-
if result.items_total > 0:
|
|
318
|
-
result.overall_score = (result.items_checked / result.items_total) * 100.0
|
|
319
|
-
|
|
320
|
-
# Generate recommendations
|
|
321
|
-
if result.critical_issues:
|
|
322
|
-
result.recommendations.append("Address critical issues before development")
|
|
323
|
-
if result.high_issues:
|
|
324
|
-
result.recommendations.append("Resolve high-priority issues")
|
|
325
|
-
if result.overall_score < 70.0:
|
|
326
|
-
result.recommendations.append("Story quality below threshold - improve before proceeding")
|
|
327
|
-
|
|
328
|
-
return result
|
|
329
|
-
|
|
330
|
-
def _is_testable(self, criterion: str) -> bool:
|
|
331
|
-
"""Check if acceptance criterion is testable."""
|
|
332
|
-
testable_indicators = ["when", "then", "should", "must", "will", "displays", "returns", "validates"]
|
|
333
|
-
return any(indicator in criterion.lower() for indicator in testable_indicators)
|
|
334
|
-
|
|
335
|
-
def _has_gwt_format(self, criterion: str) -> bool:
|
|
336
|
-
"""Check if acceptance criterion uses Given-When-Then format."""
|
|
337
|
-
criterion_lower = criterion.lower()
|
|
338
|
-
return "given" in criterion_lower and ("when" in criterion_lower or "then" in criterion_lower)
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
class ArchitectureReviewChecklist:
|
|
342
|
-
"""Review checklist for architecture."""
|
|
343
|
-
|
|
344
|
-
def get_checklist(self) -> list[ReviewItem]:
|
|
345
|
-
"""Get architecture review checklist."""
|
|
346
|
-
return [
|
|
347
|
-
ReviewItem("Requirements Alignment", "All functional requirements are addressed", severity="critical"),
|
|
348
|
-
ReviewItem("Requirements Alignment", "Non-functional requirements are addressed", severity="critical"),
|
|
349
|
-
ReviewItem("Requirements Alignment", "Performance requirements have solutions", severity="high"),
|
|
350
|
-
ReviewItem("Requirements Alignment", "Security requirements have controls", severity="critical"),
|
|
351
|
-
ReviewItem("Architecture Fundamentals", "System components are clearly defined", severity="critical"),
|
|
352
|
-
ReviewItem("Architecture Fundamentals", "Component interactions are documented", severity="high"),
|
|
353
|
-
ReviewItem("Architecture Fundamentals", "Data flow is described", severity="high"),
|
|
354
|
-
ReviewItem("Architecture Fundamentals", "System boundaries are defined", severity="high"),
|
|
355
|
-
ReviewItem("Scalability", "Scalability approach is defined", severity="high"),
|
|
356
|
-
ReviewItem("Scalability", "Load handling strategy is specified", severity="medium"),
|
|
357
|
-
ReviewItem("Security", "Authentication approach is defined", severity="critical"),
|
|
358
|
-
ReviewItem("Security", "Authorization model is specified", severity="critical"),
|
|
359
|
-
ReviewItem("Security", "Data protection measures are addressed", severity="critical"),
|
|
360
|
-
ReviewItem("Technology", "Technology stack is selected and justified", severity="high"),
|
|
361
|
-
ReviewItem("Technology", "Technology choices align with requirements", severity="high"),
|
|
362
|
-
ReviewItem("Patterns", "Architectural patterns are identified", severity="medium"),
|
|
363
|
-
ReviewItem("Patterns", "Patterns are appropriate for requirements", severity="medium"),
|
|
364
|
-
ReviewItem("Documentation", "Architecture diagrams are provided", severity="medium"),
|
|
365
|
-
ReviewItem("Documentation", "Key decisions are documented", severity="medium"),
|
|
366
|
-
]
|
|
367
|
-
|
|
368
|
-
def review(self, architecture: dict[str, Any]) -> ReviewResult:
|
|
369
|
-
"""Review architecture against checklist."""
|
|
370
|
-
checklist = self.get_checklist()
|
|
371
|
-
result = ReviewResult(items_total=len(checklist))
|
|
372
|
-
result.checklist_items = checklist
|
|
373
|
-
|
|
374
|
-
arch_text = str(architecture).lower()
|
|
375
|
-
components = architecture.get("components", [])
|
|
376
|
-
patterns = architecture.get("patterns", [])
|
|
377
|
-
|
|
378
|
-
for item in checklist:
|
|
379
|
-
checked = False
|
|
380
|
-
issue = ""
|
|
381
|
-
|
|
382
|
-
if item.category == "Requirements Alignment":
|
|
383
|
-
if "functional" in item.item.lower():
|
|
384
|
-
checked = len(components) > 0 # Has components = addresses requirements
|
|
385
|
-
if not checked:
|
|
386
|
-
issue = "No components defined"
|
|
387
|
-
elif "non-functional" in item.item.lower():
|
|
388
|
-
checked = "security" in arch_text or "performance" in arch_text or "scalability" in arch_text
|
|
389
|
-
if not checked:
|
|
390
|
-
issue = "NFRs not addressed"
|
|
391
|
-
elif "performance" in item.item.lower():
|
|
392
|
-
checked = "performance" in arch_text or "speed" in arch_text or "latency" in arch_text
|
|
393
|
-
if not checked:
|
|
394
|
-
issue = "Performance not addressed"
|
|
395
|
-
elif "security" in item.item.lower():
|
|
396
|
-
checked = "security" in arch_text or "auth" in arch_text
|
|
397
|
-
if not checked:
|
|
398
|
-
issue = "Security not addressed"
|
|
399
|
-
|
|
400
|
-
elif item.category == "Architecture Fundamentals":
|
|
401
|
-
if "components" in item.item.lower():
|
|
402
|
-
checked = len(components) > 0
|
|
403
|
-
if not checked:
|
|
404
|
-
issue = "No components defined"
|
|
405
|
-
elif "interactions" in item.item.lower():
|
|
406
|
-
checked = "interaction" in arch_text or "communication" in arch_text or "api" in arch_text
|
|
407
|
-
if not checked:
|
|
408
|
-
issue = "Component interactions not documented"
|
|
409
|
-
elif "data flow" in item.item.lower():
|
|
410
|
-
checked = "data flow" in arch_text or "data" in arch_text
|
|
411
|
-
if not checked:
|
|
412
|
-
issue = "Data flow not described"
|
|
413
|
-
elif "boundaries" in item.item.lower():
|
|
414
|
-
checked = "boundary" in arch_text or "interface" in arch_text
|
|
415
|
-
if not checked:
|
|
416
|
-
issue = "System boundaries not defined"
|
|
417
|
-
|
|
418
|
-
elif item.category == "Scalability":
|
|
419
|
-
checked = "scal" in arch_text or "scale" in arch_text or "load" in arch_text
|
|
420
|
-
if not checked:
|
|
421
|
-
issue = "Scalability not addressed"
|
|
422
|
-
|
|
423
|
-
elif item.category == "Security":
|
|
424
|
-
if "authentication" in item.item.lower():
|
|
425
|
-
checked = "auth" in arch_text
|
|
426
|
-
if not checked:
|
|
427
|
-
issue = "Authentication not defined"
|
|
428
|
-
elif "authorization" in item.item.lower():
|
|
429
|
-
checked = "authorization" in arch_text or "permission" in arch_text
|
|
430
|
-
if not checked:
|
|
431
|
-
issue = "Authorization not specified"
|
|
432
|
-
elif "data protection" in item.item.lower():
|
|
433
|
-
checked = "encrypt" in arch_text or "protection" in arch_text or "secure" in arch_text
|
|
434
|
-
if not checked:
|
|
435
|
-
issue = "Data protection not addressed"
|
|
436
|
-
|
|
437
|
-
elif item.category == "Technology":
|
|
438
|
-
tech_stack = architecture.get("technology_stack", [])
|
|
439
|
-
checked = len(tech_stack) > 0 or "technology" in arch_text
|
|
440
|
-
if not checked:
|
|
441
|
-
issue = "Technology stack not specified"
|
|
442
|
-
|
|
443
|
-
elif item.category == "Patterns":
|
|
444
|
-
checked = len(patterns) > 0 or "pattern" in arch_text
|
|
445
|
-
if not checked:
|
|
446
|
-
issue = "Architectural patterns not identified"
|
|
447
|
-
|
|
448
|
-
elif item.category == "Documentation":
|
|
449
|
-
checked = "diagram" in arch_text or "documentation" in arch_text
|
|
450
|
-
if not checked:
|
|
451
|
-
issue = "Architecture documentation missing"
|
|
452
|
-
|
|
453
|
-
item.checked = checked
|
|
454
|
-
if checked:
|
|
455
|
-
result.items_checked += 1
|
|
456
|
-
else:
|
|
457
|
-
if issue:
|
|
458
|
-
if item.severity == "critical":
|
|
459
|
-
result.critical_issues.append(f"{item.category}: {issue}")
|
|
460
|
-
elif item.severity == "high":
|
|
461
|
-
result.high_issues.append(f"{item.category}: {issue}")
|
|
462
|
-
elif item.severity == "medium":
|
|
463
|
-
result.medium_issues.append(f"{item.category}: {issue}")
|
|
464
|
-
else:
|
|
465
|
-
result.low_issues.append(f"{item.category}: {issue}")
|
|
466
|
-
|
|
467
|
-
# Calculate overall score
|
|
468
|
-
if result.items_total > 0:
|
|
469
|
-
result.overall_score = (result.items_checked / result.items_total) * 100.0
|
|
470
|
-
|
|
471
|
-
# Generate recommendations
|
|
472
|
-
if result.critical_issues:
|
|
473
|
-
result.recommendations.append("Address critical architecture issues immediately")
|
|
474
|
-
if result.high_issues:
|
|
475
|
-
result.recommendations.append("Resolve high-priority architecture concerns")
|
|
476
|
-
if result.overall_score < 75.0:
|
|
477
|
-
result.recommendations.append("Architecture quality below threshold - review and improve")
|
|
478
|
-
|
|
479
|
-
return result
|
|
1
|
+
"""
|
|
2
|
+
Review Checklists - Structured review checklists for requirements, stories, and architecture.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class ReviewItem:
|
|
14
|
+
"""A single review checklist item."""
|
|
15
|
+
|
|
16
|
+
category: str
|
|
17
|
+
item: str
|
|
18
|
+
checked: bool = False
|
|
19
|
+
notes: str = ""
|
|
20
|
+
severity: str = "medium" # "critical", "high", "medium", "low"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class ReviewResult:
|
|
25
|
+
"""Result of a review with checklist scoring."""
|
|
26
|
+
|
|
27
|
+
overall_score: float = 0.0 # 0-100
|
|
28
|
+
items_checked: int = 0
|
|
29
|
+
items_total: int = 0
|
|
30
|
+
critical_issues: list[str] = field(default_factory=list)
|
|
31
|
+
high_issues: list[str] = field(default_factory=list)
|
|
32
|
+
medium_issues: list[str] = field(default_factory=list)
|
|
33
|
+
low_issues: list[str] = field(default_factory=list)
|
|
34
|
+
recommendations: list[str] = field(default_factory=list)
|
|
35
|
+
checklist_items: list[ReviewItem] = field(default_factory=list)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class RequirementsReviewChecklist:
|
|
39
|
+
"""Review checklist for requirements."""
|
|
40
|
+
|
|
41
|
+
def get_checklist(self) -> list[ReviewItem]:
|
|
42
|
+
"""Get requirements review checklist."""
|
|
43
|
+
return [
|
|
44
|
+
ReviewItem("Completeness", "All functional requirements are documented", severity="critical"),
|
|
45
|
+
ReviewItem("Completeness", "Non-functional requirements (NFRs) are specified", severity="critical"),
|
|
46
|
+
ReviewItem("Completeness", "Technical constraints are identified", severity="high"),
|
|
47
|
+
ReviewItem("Completeness", "Assumptions are documented", severity="medium"),
|
|
48
|
+
ReviewItem("Clarity", "Requirements are unambiguous and clear", severity="critical"),
|
|
49
|
+
ReviewItem("Clarity", "No vague or ambiguous language (maybe, perhaps, could)", severity="high"),
|
|
50
|
+
ReviewItem("Clarity", "Requirements use specific, measurable language", severity="high"),
|
|
51
|
+
ReviewItem("Testability", "Each requirement has acceptance criteria", severity="critical"),
|
|
52
|
+
ReviewItem("Testability", "Requirements are testable/verifiable", severity="high"),
|
|
53
|
+
ReviewItem("Testability", "Success criteria are defined", severity="high"),
|
|
54
|
+
ReviewItem("Traceability", "Requirements are linked to user stories", severity="high"),
|
|
55
|
+
ReviewItem("Traceability", "Requirements can be traced to tests", severity="medium"),
|
|
56
|
+
ReviewItem("Feasibility", "Requirements are technically feasible", severity="high"),
|
|
57
|
+
ReviewItem("Feasibility", "No impossible or unrealistic requirements", severity="critical"),
|
|
58
|
+
ReviewItem("Feasibility", "Technical approach is viable", severity="medium"),
|
|
59
|
+
ReviewItem("Consistency", "No conflicting requirements", severity="critical"),
|
|
60
|
+
ReviewItem("Consistency", "Terminology is consistent throughout", severity="medium"),
|
|
61
|
+
ReviewItem("Prioritization", "Requirements are prioritized", severity="medium"),
|
|
62
|
+
ReviewItem("Prioritization", "Critical requirements are identified", severity="high"),
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
def review(self, requirements: dict[str, Any]) -> ReviewResult:
|
|
66
|
+
"""Review requirements against checklist."""
|
|
67
|
+
checklist = self.get_checklist()
|
|
68
|
+
result = ReviewResult(items_total=len(checklist))
|
|
69
|
+
result.checklist_items = checklist
|
|
70
|
+
|
|
71
|
+
# Evaluate each item
|
|
72
|
+
func_reqs = requirements.get("functional_requirements", [])
|
|
73
|
+
nfr_reqs = requirements.get("non_functional_requirements", [])
|
|
74
|
+
constraints = requirements.get("constraints", [])
|
|
75
|
+
assumptions = requirements.get("assumptions", [])
|
|
76
|
+
|
|
77
|
+
for item in checklist:
|
|
78
|
+
checked = False
|
|
79
|
+
issue = ""
|
|
80
|
+
|
|
81
|
+
if item.category == "Completeness":
|
|
82
|
+
if "functional requirements" in item.item.lower():
|
|
83
|
+
checked = len(func_reqs) > 0
|
|
84
|
+
if not checked:
|
|
85
|
+
issue = "No functional requirements documented"
|
|
86
|
+
elif "non-functional" in item.item.lower():
|
|
87
|
+
checked = len(nfr_reqs) > 0
|
|
88
|
+
if not checked:
|
|
89
|
+
issue = "No non-functional requirements specified"
|
|
90
|
+
elif "constraints" in item.item.lower():
|
|
91
|
+
checked = len(constraints) > 0
|
|
92
|
+
elif "assumptions" in item.item.lower():
|
|
93
|
+
checked = len(assumptions) > 0
|
|
94
|
+
|
|
95
|
+
elif item.category == "Clarity":
|
|
96
|
+
all_text = " ".join(str(r) for r in func_reqs).lower()
|
|
97
|
+
if "unambiguous" in item.item.lower():
|
|
98
|
+
vague_words = ["maybe", "perhaps", "might", "could", "should consider"]
|
|
99
|
+
checked = not any(word in all_text for word in vague_words)
|
|
100
|
+
if not checked:
|
|
101
|
+
issue = "Vague language found in requirements"
|
|
102
|
+
elif "specific" in item.item.lower():
|
|
103
|
+
checked = len(all_text) > 100 # Has substantial content
|
|
104
|
+
if not checked:
|
|
105
|
+
issue = "Requirements lack specificity"
|
|
106
|
+
|
|
107
|
+
elif item.category == "Testability":
|
|
108
|
+
acceptance = requirements.get("acceptance_criteria", [])
|
|
109
|
+
if "acceptance criteria" in item.item.lower():
|
|
110
|
+
checked = len(acceptance) > 0
|
|
111
|
+
if not checked:
|
|
112
|
+
issue = "No acceptance criteria defined"
|
|
113
|
+
elif "testable" in item.item.lower():
|
|
114
|
+
# Check if requirements have testable language
|
|
115
|
+
testable_indicators = ["must", "shall", "will", "should", "validates", "verifies"]
|
|
116
|
+
all_text = " ".join(str(r) for r in func_reqs).lower()
|
|
117
|
+
checked = any(indicator in all_text for indicator in testable_indicators)
|
|
118
|
+
if not checked:
|
|
119
|
+
issue = "Requirements lack testable language"
|
|
120
|
+
|
|
121
|
+
elif item.category == "Traceability":
|
|
122
|
+
# Check for links
|
|
123
|
+
linked_count = 0
|
|
124
|
+
for req in func_reqs:
|
|
125
|
+
if isinstance(req, dict):
|
|
126
|
+
if any(key in req for key in ["story_id", "story_link", "related_stories"]):
|
|
127
|
+
linked_count += 1
|
|
128
|
+
checked = linked_count > 0
|
|
129
|
+
if not checked:
|
|
130
|
+
issue = "Requirements not linked to stories"
|
|
131
|
+
|
|
132
|
+
elif item.category == "Feasibility":
|
|
133
|
+
all_text = " ".join(str(r) for r in func_reqs).lower()
|
|
134
|
+
impossible = ["instantaneous", "zero latency", "infinite", "perfect", "100% uptime"]
|
|
135
|
+
checked = not any(word in all_text for word in impossible)
|
|
136
|
+
if not checked:
|
|
137
|
+
issue = "Impossible requirements detected"
|
|
138
|
+
|
|
139
|
+
elif item.category == "Consistency":
|
|
140
|
+
# Basic consistency check
|
|
141
|
+
checked = True # Would need more sophisticated analysis
|
|
142
|
+
if "conflicting" in item.item.lower():
|
|
143
|
+
# Check for contradictions (simplified)
|
|
144
|
+
checked = True # Placeholder
|
|
145
|
+
|
|
146
|
+
elif item.category == "Prioritization":
|
|
147
|
+
prioritized_count = 0
|
|
148
|
+
for req in func_reqs:
|
|
149
|
+
if isinstance(req, dict):
|
|
150
|
+
if "priority" in req or "importance" in req:
|
|
151
|
+
prioritized_count += 1
|
|
152
|
+
checked = prioritized_count > 0
|
|
153
|
+
if not checked:
|
|
154
|
+
issue = "Requirements not prioritized"
|
|
155
|
+
|
|
156
|
+
item.checked = checked
|
|
157
|
+
if checked:
|
|
158
|
+
result.items_checked += 1
|
|
159
|
+
else:
|
|
160
|
+
if issue:
|
|
161
|
+
if item.severity == "critical":
|
|
162
|
+
result.critical_issues.append(f"{item.category}: {issue}")
|
|
163
|
+
elif item.severity == "high":
|
|
164
|
+
result.high_issues.append(f"{item.category}: {issue}")
|
|
165
|
+
elif item.severity == "medium":
|
|
166
|
+
result.medium_issues.append(f"{item.category}: {issue}")
|
|
167
|
+
else:
|
|
168
|
+
result.low_issues.append(f"{item.category}: {issue}")
|
|
169
|
+
|
|
170
|
+
# Calculate overall score
|
|
171
|
+
if result.items_total > 0:
|
|
172
|
+
result.overall_score = (result.items_checked / result.items_total) * 100.0
|
|
173
|
+
|
|
174
|
+
# Generate recommendations
|
|
175
|
+
if result.critical_issues:
|
|
176
|
+
result.recommendations.append("Address critical issues immediately")
|
|
177
|
+
if result.high_issues:
|
|
178
|
+
result.recommendations.append("Resolve high-priority issues before proceeding")
|
|
179
|
+
if result.overall_score < 70.0:
|
|
180
|
+
result.recommendations.append("Overall score below threshold - review and improve requirements")
|
|
181
|
+
|
|
182
|
+
return result
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class StoryReviewChecklist:
|
|
186
|
+
"""Review checklist for user stories."""
|
|
187
|
+
|
|
188
|
+
def get_checklist(self) -> list[ReviewItem]:
|
|
189
|
+
"""Get story review checklist (INVEST-based)."""
|
|
190
|
+
return [
|
|
191
|
+
ReviewItem("INVEST", "Story is Independent (can be developed standalone)", severity="high"),
|
|
192
|
+
ReviewItem("INVEST", "Story is Negotiable (details can be discussed)", severity="medium"),
|
|
193
|
+
ReviewItem("INVEST", "Story is Valuable (delivers user/business value)", severity="critical"),
|
|
194
|
+
ReviewItem("INVEST", "Story is Estimable (can be sized)", severity="high"),
|
|
195
|
+
ReviewItem("INVEST", "Story is Small (appropriately sized)", severity="high"),
|
|
196
|
+
ReviewItem("INVEST", "Story is Testable (has clear acceptance criteria)", severity="critical"),
|
|
197
|
+
ReviewItem("Format", "Story follows 'As a... I want... So that...' format", severity="high"),
|
|
198
|
+
ReviewItem("Format", "Story has clear title", severity="medium"),
|
|
199
|
+
ReviewItem("Acceptance Criteria", "At least 2-3 acceptance criteria defined", severity="critical"),
|
|
200
|
+
ReviewItem("Acceptance Criteria", "Acceptance criteria are testable", severity="high"),
|
|
201
|
+
ReviewItem("Acceptance Criteria", "Acceptance criteria use Given-When-Then format", severity="medium"),
|
|
202
|
+
ReviewItem("Dependencies", "Dependencies are identified", severity="high"),
|
|
203
|
+
ReviewItem("Dependencies", "Story has minimal dependencies (< 3)", severity="medium"),
|
|
204
|
+
ReviewItem("Estimation", "Story points assigned (Fibonacci: 1, 2, 3, 5, 8, 13)", severity="high"),
|
|
205
|
+
ReviewItem("Estimation", "Story points are reasonable for scope", severity="medium"),
|
|
206
|
+
ReviewItem("Value", "'So that...' clause clearly states value", severity="critical"),
|
|
207
|
+
ReviewItem("Value", "Story aligns with business goals", severity="medium"),
|
|
208
|
+
]
|
|
209
|
+
|
|
210
|
+
def review(self, story: dict[str, Any]) -> ReviewResult:
|
|
211
|
+
"""Review story against checklist."""
|
|
212
|
+
checklist = self.get_checklist()
|
|
213
|
+
result = ReviewResult(items_total=len(checklist))
|
|
214
|
+
result.checklist_items = checklist
|
|
215
|
+
|
|
216
|
+
description = story.get("description", "")
|
|
217
|
+
acceptance = story.get("acceptance_criteria", [])
|
|
218
|
+
dependencies = story.get("dependencies", [])
|
|
219
|
+
story_points = story.get("story_points", 0)
|
|
220
|
+
|
|
221
|
+
for item in checklist:
|
|
222
|
+
checked = False
|
|
223
|
+
issue = ""
|
|
224
|
+
|
|
225
|
+
if item.category == "INVEST":
|
|
226
|
+
if "Independent" in item.item:
|
|
227
|
+
checked = len(dependencies) <= 2
|
|
228
|
+
if not checked:
|
|
229
|
+
issue = f"Too many dependencies ({len(dependencies)})"
|
|
230
|
+
elif "Negotiable" in item.item:
|
|
231
|
+
prescriptive = ["must", "shall", "exactly", "precisely"]
|
|
232
|
+
checked = not any(word in description.lower() for word in prescriptive)
|
|
233
|
+
if not checked:
|
|
234
|
+
issue = "Story is too prescriptive"
|
|
235
|
+
elif "Valuable" in item.item:
|
|
236
|
+
checked = "so that" in description.lower()
|
|
237
|
+
if not checked:
|
|
238
|
+
issue = "Missing 'So that...' value clause"
|
|
239
|
+
elif "Estimable" in item.item:
|
|
240
|
+
checked = story_points > 0
|
|
241
|
+
if not checked:
|
|
242
|
+
issue = "No story points assigned"
|
|
243
|
+
elif "Small" in item.item:
|
|
244
|
+
checked = 1 <= story_points <= 8
|
|
245
|
+
if not checked:
|
|
246
|
+
issue = f"Story too large ({story_points} points)"
|
|
247
|
+
elif "Testable" in item.item:
|
|
248
|
+
checked = len(acceptance) >= 2
|
|
249
|
+
if not checked:
|
|
250
|
+
issue = "Insufficient acceptance criteria"
|
|
251
|
+
|
|
252
|
+
elif item.category == "Format":
|
|
253
|
+
if "As a" in item.item:
|
|
254
|
+
checked = "as a" in description.lower() and "i want" in description.lower()
|
|
255
|
+
if not checked:
|
|
256
|
+
issue = "Story doesn't follow standard format"
|
|
257
|
+
elif "title" in item.item.lower():
|
|
258
|
+
checked = bool(story.get("title"))
|
|
259
|
+
if not checked:
|
|
260
|
+
issue = "Story missing title"
|
|
261
|
+
|
|
262
|
+
elif item.category == "Acceptance Criteria":
|
|
263
|
+
if "2-3" in item.item:
|
|
264
|
+
checked = 2 <= len(acceptance) <= 7
|
|
265
|
+
if not checked:
|
|
266
|
+
issue = f"Acceptance criteria count: {len(acceptance)} (expected 2-7)"
|
|
267
|
+
elif "testable" in item.item.lower():
|
|
268
|
+
testable_count = sum(1 for ac in acceptance if self._is_testable(ac))
|
|
269
|
+
checked = testable_count > 0
|
|
270
|
+
if not checked:
|
|
271
|
+
issue = "Acceptance criteria not testable"
|
|
272
|
+
elif "Given-When-Then" in item.item:
|
|
273
|
+
gwt_count = sum(1 for ac in acceptance if self._has_gwt_format(ac))
|
|
274
|
+
checked = gwt_count > 0
|
|
275
|
+
if not checked:
|
|
276
|
+
issue = "Acceptance criteria should use Given-When-Then format"
|
|
277
|
+
|
|
278
|
+
elif item.category == "Dependencies":
|
|
279
|
+
if "identified" in item.item.lower():
|
|
280
|
+
checked = True # Dependencies list exists
|
|
281
|
+
elif "minimal" in item.item.lower():
|
|
282
|
+
checked = len(dependencies) < 3
|
|
283
|
+
if not checked:
|
|
284
|
+
issue = f"Too many dependencies: {len(dependencies)}"
|
|
285
|
+
|
|
286
|
+
elif item.category == "Estimation":
|
|
287
|
+
if "assigned" in item.item.lower():
|
|
288
|
+
checked = story_points > 0
|
|
289
|
+
if not checked:
|
|
290
|
+
issue = "Story points not assigned"
|
|
291
|
+
elif "reasonable" in item.item.lower():
|
|
292
|
+
checked = 1 <= story_points <= 13
|
|
293
|
+
if not checked:
|
|
294
|
+
issue = f"Story points out of range: {story_points}"
|
|
295
|
+
|
|
296
|
+
elif item.category == "Value":
|
|
297
|
+
if "So that" in item.item:
|
|
298
|
+
checked = "so that" in description.lower()
|
|
299
|
+
if not checked:
|
|
300
|
+
issue = "Missing value statement ('So that...')"
|
|
301
|
+
|
|
302
|
+
item.checked = checked
|
|
303
|
+
if checked:
|
|
304
|
+
result.items_checked += 1
|
|
305
|
+
else:
|
|
306
|
+
if issue:
|
|
307
|
+
if item.severity == "critical":
|
|
308
|
+
result.critical_issues.append(f"{item.category}: {issue}")
|
|
309
|
+
elif item.severity == "high":
|
|
310
|
+
result.high_issues.append(f"{item.category}: {issue}")
|
|
311
|
+
elif item.severity == "medium":
|
|
312
|
+
result.medium_issues.append(f"{item.category}: {issue}")
|
|
313
|
+
else:
|
|
314
|
+
result.low_issues.append(f"{item.category}: {issue}")
|
|
315
|
+
|
|
316
|
+
# Calculate overall score
|
|
317
|
+
if result.items_total > 0:
|
|
318
|
+
result.overall_score = (result.items_checked / result.items_total) * 100.0
|
|
319
|
+
|
|
320
|
+
# Generate recommendations
|
|
321
|
+
if result.critical_issues:
|
|
322
|
+
result.recommendations.append("Address critical issues before development")
|
|
323
|
+
if result.high_issues:
|
|
324
|
+
result.recommendations.append("Resolve high-priority issues")
|
|
325
|
+
if result.overall_score < 70.0:
|
|
326
|
+
result.recommendations.append("Story quality below threshold - improve before proceeding")
|
|
327
|
+
|
|
328
|
+
return result
|
|
329
|
+
|
|
330
|
+
def _is_testable(self, criterion: str) -> bool:
|
|
331
|
+
"""Check if acceptance criterion is testable."""
|
|
332
|
+
testable_indicators = ["when", "then", "should", "must", "will", "displays", "returns", "validates"]
|
|
333
|
+
return any(indicator in criterion.lower() for indicator in testable_indicators)
|
|
334
|
+
|
|
335
|
+
def _has_gwt_format(self, criterion: str) -> bool:
|
|
336
|
+
"""Check if acceptance criterion uses Given-When-Then format."""
|
|
337
|
+
criterion_lower = criterion.lower()
|
|
338
|
+
return "given" in criterion_lower and ("when" in criterion_lower or "then" in criterion_lower)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
class ArchitectureReviewChecklist:
|
|
342
|
+
"""Review checklist for architecture."""
|
|
343
|
+
|
|
344
|
+
def get_checklist(self) -> list[ReviewItem]:
|
|
345
|
+
"""Get architecture review checklist."""
|
|
346
|
+
return [
|
|
347
|
+
ReviewItem("Requirements Alignment", "All functional requirements are addressed", severity="critical"),
|
|
348
|
+
ReviewItem("Requirements Alignment", "Non-functional requirements are addressed", severity="critical"),
|
|
349
|
+
ReviewItem("Requirements Alignment", "Performance requirements have solutions", severity="high"),
|
|
350
|
+
ReviewItem("Requirements Alignment", "Security requirements have controls", severity="critical"),
|
|
351
|
+
ReviewItem("Architecture Fundamentals", "System components are clearly defined", severity="critical"),
|
|
352
|
+
ReviewItem("Architecture Fundamentals", "Component interactions are documented", severity="high"),
|
|
353
|
+
ReviewItem("Architecture Fundamentals", "Data flow is described", severity="high"),
|
|
354
|
+
ReviewItem("Architecture Fundamentals", "System boundaries are defined", severity="high"),
|
|
355
|
+
ReviewItem("Scalability", "Scalability approach is defined", severity="high"),
|
|
356
|
+
ReviewItem("Scalability", "Load handling strategy is specified", severity="medium"),
|
|
357
|
+
ReviewItem("Security", "Authentication approach is defined", severity="critical"),
|
|
358
|
+
ReviewItem("Security", "Authorization model is specified", severity="critical"),
|
|
359
|
+
ReviewItem("Security", "Data protection measures are addressed", severity="critical"),
|
|
360
|
+
ReviewItem("Technology", "Technology stack is selected and justified", severity="high"),
|
|
361
|
+
ReviewItem("Technology", "Technology choices align with requirements", severity="high"),
|
|
362
|
+
ReviewItem("Patterns", "Architectural patterns are identified", severity="medium"),
|
|
363
|
+
ReviewItem("Patterns", "Patterns are appropriate for requirements", severity="medium"),
|
|
364
|
+
ReviewItem("Documentation", "Architecture diagrams are provided", severity="medium"),
|
|
365
|
+
ReviewItem("Documentation", "Key decisions are documented", severity="medium"),
|
|
366
|
+
]
|
|
367
|
+
|
|
368
|
+
def review(self, architecture: dict[str, Any]) -> ReviewResult:
|
|
369
|
+
"""Review architecture against checklist."""
|
|
370
|
+
checklist = self.get_checklist()
|
|
371
|
+
result = ReviewResult(items_total=len(checklist))
|
|
372
|
+
result.checklist_items = checklist
|
|
373
|
+
|
|
374
|
+
arch_text = str(architecture).lower()
|
|
375
|
+
components = architecture.get("components", [])
|
|
376
|
+
patterns = architecture.get("patterns", [])
|
|
377
|
+
|
|
378
|
+
for item in checklist:
|
|
379
|
+
checked = False
|
|
380
|
+
issue = ""
|
|
381
|
+
|
|
382
|
+
if item.category == "Requirements Alignment":
|
|
383
|
+
if "functional" in item.item.lower():
|
|
384
|
+
checked = len(components) > 0 # Has components = addresses requirements
|
|
385
|
+
if not checked:
|
|
386
|
+
issue = "No components defined"
|
|
387
|
+
elif "non-functional" in item.item.lower():
|
|
388
|
+
checked = "security" in arch_text or "performance" in arch_text or "scalability" in arch_text
|
|
389
|
+
if not checked:
|
|
390
|
+
issue = "NFRs not addressed"
|
|
391
|
+
elif "performance" in item.item.lower():
|
|
392
|
+
checked = "performance" in arch_text or "speed" in arch_text or "latency" in arch_text
|
|
393
|
+
if not checked:
|
|
394
|
+
issue = "Performance not addressed"
|
|
395
|
+
elif "security" in item.item.lower():
|
|
396
|
+
checked = "security" in arch_text or "auth" in arch_text
|
|
397
|
+
if not checked:
|
|
398
|
+
issue = "Security not addressed"
|
|
399
|
+
|
|
400
|
+
elif item.category == "Architecture Fundamentals":
|
|
401
|
+
if "components" in item.item.lower():
|
|
402
|
+
checked = len(components) > 0
|
|
403
|
+
if not checked:
|
|
404
|
+
issue = "No components defined"
|
|
405
|
+
elif "interactions" in item.item.lower():
|
|
406
|
+
checked = "interaction" in arch_text or "communication" in arch_text or "api" in arch_text
|
|
407
|
+
if not checked:
|
|
408
|
+
issue = "Component interactions not documented"
|
|
409
|
+
elif "data flow" in item.item.lower():
|
|
410
|
+
checked = "data flow" in arch_text or "data" in arch_text
|
|
411
|
+
if not checked:
|
|
412
|
+
issue = "Data flow not described"
|
|
413
|
+
elif "boundaries" in item.item.lower():
|
|
414
|
+
checked = "boundary" in arch_text or "interface" in arch_text
|
|
415
|
+
if not checked:
|
|
416
|
+
issue = "System boundaries not defined"
|
|
417
|
+
|
|
418
|
+
elif item.category == "Scalability":
|
|
419
|
+
checked = "scal" in arch_text or "scale" in arch_text or "load" in arch_text
|
|
420
|
+
if not checked:
|
|
421
|
+
issue = "Scalability not addressed"
|
|
422
|
+
|
|
423
|
+
elif item.category == "Security":
|
|
424
|
+
if "authentication" in item.item.lower():
|
|
425
|
+
checked = "auth" in arch_text
|
|
426
|
+
if not checked:
|
|
427
|
+
issue = "Authentication not defined"
|
|
428
|
+
elif "authorization" in item.item.lower():
|
|
429
|
+
checked = "authorization" in arch_text or "permission" in arch_text
|
|
430
|
+
if not checked:
|
|
431
|
+
issue = "Authorization not specified"
|
|
432
|
+
elif "data protection" in item.item.lower():
|
|
433
|
+
checked = "encrypt" in arch_text or "protection" in arch_text or "secure" in arch_text
|
|
434
|
+
if not checked:
|
|
435
|
+
issue = "Data protection not addressed"
|
|
436
|
+
|
|
437
|
+
elif item.category == "Technology":
|
|
438
|
+
tech_stack = architecture.get("technology_stack", [])
|
|
439
|
+
checked = len(tech_stack) > 0 or "technology" in arch_text
|
|
440
|
+
if not checked:
|
|
441
|
+
issue = "Technology stack not specified"
|
|
442
|
+
|
|
443
|
+
elif item.category == "Patterns":
|
|
444
|
+
checked = len(patterns) > 0 or "pattern" in arch_text
|
|
445
|
+
if not checked:
|
|
446
|
+
issue = "Architectural patterns not identified"
|
|
447
|
+
|
|
448
|
+
elif item.category == "Documentation":
|
|
449
|
+
checked = "diagram" in arch_text or "documentation" in arch_text
|
|
450
|
+
if not checked:
|
|
451
|
+
issue = "Architecture documentation missing"
|
|
452
|
+
|
|
453
|
+
item.checked = checked
|
|
454
|
+
if checked:
|
|
455
|
+
result.items_checked += 1
|
|
456
|
+
else:
|
|
457
|
+
if issue:
|
|
458
|
+
if item.severity == "critical":
|
|
459
|
+
result.critical_issues.append(f"{item.category}: {issue}")
|
|
460
|
+
elif item.severity == "high":
|
|
461
|
+
result.high_issues.append(f"{item.category}: {issue}")
|
|
462
|
+
elif item.severity == "medium":
|
|
463
|
+
result.medium_issues.append(f"{item.category}: {issue}")
|
|
464
|
+
else:
|
|
465
|
+
result.low_issues.append(f"{item.category}: {issue}")
|
|
466
|
+
|
|
467
|
+
# Calculate overall score
|
|
468
|
+
if result.items_total > 0:
|
|
469
|
+
result.overall_score = (result.items_checked / result.items_total) * 100.0
|
|
470
|
+
|
|
471
|
+
# Generate recommendations
|
|
472
|
+
if result.critical_issues:
|
|
473
|
+
result.recommendations.append("Address critical architecture issues immediately")
|
|
474
|
+
if result.high_issues:
|
|
475
|
+
result.recommendations.append("Resolve high-priority architecture concerns")
|
|
476
|
+
if result.overall_score < 75.0:
|
|
477
|
+
result.recommendations.append("Architecture quality below threshold - review and improve")
|
|
478
|
+
|
|
479
|
+
return result
|