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,393 +1,393 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Documentation Validator - Validates documentation completeness and consistency.
|
|
3
|
-
|
|
4
|
-
This module validates that all project documentation is updated when new agents
|
|
5
|
-
are added to the framework.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import logging
|
|
9
|
-
import re
|
|
10
|
-
from dataclasses import dataclass, field
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
from typing import Any
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@dataclass
|
|
18
|
-
class ValidationResult:
|
|
19
|
-
"""Documentation validation result."""
|
|
20
|
-
|
|
21
|
-
readme_valid: bool = False
|
|
22
|
-
api_valid: bool = False
|
|
23
|
-
architecture_valid: bool = False
|
|
24
|
-
capabilities_valid: bool = False
|
|
25
|
-
consistency_valid: bool = False
|
|
26
|
-
agent_count: dict[str, int] = field(default_factory=dict)
|
|
27
|
-
errors: list[str] = field(default_factory=list)
|
|
28
|
-
warnings: list[str] = field(default_factory=list)
|
|
29
|
-
|
|
30
|
-
@property
|
|
31
|
-
def is_complete(self) -> bool:
|
|
32
|
-
"""Check if all documentation is complete."""
|
|
33
|
-
return (
|
|
34
|
-
self.readme_valid
|
|
35
|
-
and self.api_valid
|
|
36
|
-
and self.architecture_valid
|
|
37
|
-
and self.capabilities_valid
|
|
38
|
-
and self.consistency_valid
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
@dataclass
|
|
43
|
-
class ConsistencyResult:
|
|
44
|
-
"""Agent count consistency check result."""
|
|
45
|
-
|
|
46
|
-
is_consistent: bool = False
|
|
47
|
-
counts: dict[str, int] = field(default_factory=dict)
|
|
48
|
-
discrepancies: list[str] = field(default_factory=list)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
class DocValidator:
|
|
52
|
-
"""Validate documentation completeness and consistency."""
|
|
53
|
-
|
|
54
|
-
def __init__(self, project_root: Path):
|
|
55
|
-
"""
|
|
56
|
-
Initialize documentation validator.
|
|
57
|
-
|
|
58
|
-
Args:
|
|
59
|
-
project_root: Project root directory
|
|
60
|
-
"""
|
|
61
|
-
self.project_root = project_root
|
|
62
|
-
self.readme_path = project_root / "README.md"
|
|
63
|
-
self.api_path = project_root / "docs" / "API.md"
|
|
64
|
-
self.arch_path = project_root / "docs" / "ARCHITECTURE.md"
|
|
65
|
-
self.capabilities_path = (
|
|
66
|
-
project_root / ".cursor" / "rules" / "agent-capabilities.mdc"
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
def validate_completeness(self, agent_name: str) -> ValidationResult:
|
|
70
|
-
"""
|
|
71
|
-
Validate all documentation is complete for an agent.
|
|
72
|
-
|
|
73
|
-
Args:
|
|
74
|
-
agent_name: Agent name to validate
|
|
75
|
-
|
|
76
|
-
Returns:
|
|
77
|
-
ValidationResult with validation status
|
|
78
|
-
"""
|
|
79
|
-
result = ValidationResult()
|
|
80
|
-
|
|
81
|
-
# Validate each documentation file
|
|
82
|
-
result.readme_valid = self.validate_readme(agent_name)
|
|
83
|
-
result.api_valid = self.validate_api_docs(agent_name)
|
|
84
|
-
result.architecture_valid = self.validate_architecture_docs(agent_name)
|
|
85
|
-
result.capabilities_valid = self.validate_agent_capabilities(agent_name)
|
|
86
|
-
|
|
87
|
-
# Check consistency
|
|
88
|
-
consistency = self.check_consistency()
|
|
89
|
-
result.consistency_valid = consistency.is_consistent
|
|
90
|
-
result.agent_count = consistency.counts
|
|
91
|
-
|
|
92
|
-
# Collect errors and warnings
|
|
93
|
-
if not result.readme_valid:
|
|
94
|
-
result.errors.append(f"README.md does not mention {agent_name}")
|
|
95
|
-
if not result.api_valid:
|
|
96
|
-
result.errors.append(f"API.md does not document {agent_name}")
|
|
97
|
-
if not result.architecture_valid:
|
|
98
|
-
result.errors.append(f"ARCHITECTURE.md does not include {agent_name}")
|
|
99
|
-
if not result.capabilities_valid:
|
|
100
|
-
result.errors.append(
|
|
101
|
-
f"agent-capabilities.mdc does not have {agent_name} section"
|
|
102
|
-
)
|
|
103
|
-
if not result.consistency_valid:
|
|
104
|
-
result.warnings.append(
|
|
105
|
-
f"Agent count inconsistency: {consistency.discrepancies}"
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
return result
|
|
109
|
-
|
|
110
|
-
def validate_readme(
|
|
111
|
-
self, agent_name: str, readme_path: Path | None = None
|
|
112
|
-
) -> bool:
|
|
113
|
-
"""
|
|
114
|
-
Check README.md mentions agent.
|
|
115
|
-
|
|
116
|
-
Args:
|
|
117
|
-
agent_name: Agent name to check
|
|
118
|
-
readme_path: README.md path (default: self.readme_path)
|
|
119
|
-
|
|
120
|
-
Returns:
|
|
121
|
-
True if agent is mentioned in README.md
|
|
122
|
-
"""
|
|
123
|
-
if readme_path is None:
|
|
124
|
-
readme_path = self.readme_path
|
|
125
|
-
|
|
126
|
-
if not readme_path.exists():
|
|
127
|
-
logger.warning(f"README.md not found: {readme_path}")
|
|
128
|
-
return False
|
|
129
|
-
|
|
130
|
-
try:
|
|
131
|
-
content = readme_path.read_text(encoding="utf-8")
|
|
132
|
-
# Check for agent name in various patterns
|
|
133
|
-
patterns = [
|
|
134
|
-
rf"`@{agent_name}`", # @agent_name
|
|
135
|
-
rf"\b{agent_name}\b", # Word boundary
|
|
136
|
-
]
|
|
137
|
-
return any(re.search(pattern, content, re.IGNORECASE) for pattern in patterns)
|
|
138
|
-
except Exception as e:
|
|
139
|
-
logger.error(f"Failed to validate README.md: {e}")
|
|
140
|
-
return False
|
|
141
|
-
|
|
142
|
-
def validate_api_docs(
|
|
143
|
-
self, agent_name: str, api_path: Path | None = None
|
|
144
|
-
) -> bool:
|
|
145
|
-
"""
|
|
146
|
-
Check API.md documents agent.
|
|
147
|
-
|
|
148
|
-
Args:
|
|
149
|
-
agent_name: Agent name to check
|
|
150
|
-
api_path: API.md path (default: self.api_path)
|
|
151
|
-
|
|
152
|
-
Returns:
|
|
153
|
-
True if agent is documented in API.md
|
|
154
|
-
"""
|
|
155
|
-
if api_path is None:
|
|
156
|
-
api_path = self.api_path
|
|
157
|
-
|
|
158
|
-
if not api_path.exists():
|
|
159
|
-
logger.warning(f"API.md not found: {api_path}")
|
|
160
|
-
return False
|
|
161
|
-
|
|
162
|
-
try:
|
|
163
|
-
content = api_path.read_text(encoding="utf-8")
|
|
164
|
-
# Check for agent name in subcommands and API section
|
|
165
|
-
patterns = [
|
|
166
|
-
rf"- `{agent_name}`", # Subcommand
|
|
167
|
-
rf"## {agent_name.title()} Agent", # API section
|
|
168
|
-
rf"\b{agent_name}\b", # Word boundary
|
|
169
|
-
]
|
|
170
|
-
return any(re.search(pattern, content, re.IGNORECASE) for pattern in patterns)
|
|
171
|
-
except Exception as e:
|
|
172
|
-
logger.error(f"Failed to validate API.md: {e}")
|
|
173
|
-
return False
|
|
174
|
-
|
|
175
|
-
def validate_architecture_docs(
|
|
176
|
-
self, agent_name: str, arch_path: Path | None = None
|
|
177
|
-
) -> bool:
|
|
178
|
-
"""
|
|
179
|
-
Check ARCHITECTURE.md includes agent.
|
|
180
|
-
|
|
181
|
-
Args:
|
|
182
|
-
agent_name: Agent name to check
|
|
183
|
-
arch_path: ARCHITECTURE.md path (default: self.arch_path)
|
|
184
|
-
|
|
185
|
-
Returns:
|
|
186
|
-
True if agent is included in ARCHITECTURE.md
|
|
187
|
-
"""
|
|
188
|
-
if arch_path is None:
|
|
189
|
-
arch_path = self.arch_path
|
|
190
|
-
|
|
191
|
-
if not arch_path.exists():
|
|
192
|
-
logger.warning(f"ARCHITECTURE.md not found: {arch_path}")
|
|
193
|
-
return False
|
|
194
|
-
|
|
195
|
-
try:
|
|
196
|
-
content = arch_path.read_text(encoding="utf-8")
|
|
197
|
-
# Check for agent name in agent list
|
|
198
|
-
# Convert snake_case to Title Case for matching
|
|
199
|
-
agent_name_title = agent_name.replace("_", " ").title()
|
|
200
|
-
patterns = [
|
|
201
|
-
rf"\*\*{re.escape(agent_name_title)} Agent\*\*", # **Agent Name Agent**
|
|
202
|
-
rf"\*\*{re.escape(agent_name.title())} Agent\*\*", # **Agent_Name Agent** (fallback)
|
|
203
|
-
rf"\b{agent_name}\b", # Word boundary
|
|
204
|
-
]
|
|
205
|
-
return any(re.search(pattern, content, re.IGNORECASE) for pattern in patterns)
|
|
206
|
-
except Exception as e:
|
|
207
|
-
logger.error(f"Failed to validate ARCHITECTURE.md: {e}")
|
|
208
|
-
return False
|
|
209
|
-
|
|
210
|
-
def validate_agent_capabilities(
|
|
211
|
-
self, agent_name: str, capabilities_path: Path | None = None
|
|
212
|
-
) -> bool:
|
|
213
|
-
"""
|
|
214
|
-
Check agent-capabilities.mdc has agent section.
|
|
215
|
-
|
|
216
|
-
Args:
|
|
217
|
-
agent_name: Agent name to check
|
|
218
|
-
capabilities_path: agent-capabilities.mdc path (default: self.capabilities_path)
|
|
219
|
-
|
|
220
|
-
Returns:
|
|
221
|
-
True if agent section exists in agent-capabilities.mdc
|
|
222
|
-
"""
|
|
223
|
-
if capabilities_path is None:
|
|
224
|
-
capabilities_path = self.capabilities_path
|
|
225
|
-
|
|
226
|
-
if not capabilities_path.exists():
|
|
227
|
-
logger.warning(f"agent-capabilities.mdc not found: {capabilities_path}")
|
|
228
|
-
return False
|
|
229
|
-
|
|
230
|
-
try:
|
|
231
|
-
content = capabilities_path.read_text(encoding="utf-8")
|
|
232
|
-
# Check for agent section heading
|
|
233
|
-
# Convert snake_case to Title Case for matching
|
|
234
|
-
agent_name_title = agent_name.replace("_", " ").title()
|
|
235
|
-
patterns = [
|
|
236
|
-
rf"### {re.escape(agent_name_title)} Agent", # ### Agent Name Agent
|
|
237
|
-
rf"### {re.escape(agent_name.title())} Agent", # ### Agent_Name Agent (fallback)
|
|
238
|
-
]
|
|
239
|
-
return any(re.search(pattern, content) for pattern in patterns)
|
|
240
|
-
except Exception as e:
|
|
241
|
-
logger.error(f"Failed to validate agent-capabilities.mdc: {e}")
|
|
242
|
-
return False
|
|
243
|
-
|
|
244
|
-
def check_consistency(self) -> ConsistencyResult:
|
|
245
|
-
"""
|
|
246
|
-
Check agent count consistency across all documentation.
|
|
247
|
-
|
|
248
|
-
Returns:
|
|
249
|
-
ConsistencyResult with consistency status
|
|
250
|
-
"""
|
|
251
|
-
result = ConsistencyResult()
|
|
252
|
-
|
|
253
|
-
# Extract agent counts from each documentation file
|
|
254
|
-
counts = {}
|
|
255
|
-
|
|
256
|
-
# README.md
|
|
257
|
-
if self.readme_path.exists():
|
|
258
|
-
try:
|
|
259
|
-
content = self.readme_path.read_text(encoding="utf-8")
|
|
260
|
-
match = re.search(
|
|
261
|
-
r"- \*\*Workflow Agents\*\* \((\d+)\):", content
|
|
262
|
-
)
|
|
263
|
-
if match:
|
|
264
|
-
counts["README.md"] = int(match.group(1))
|
|
265
|
-
except Exception as e:
|
|
266
|
-
logger.debug(f"Failed to extract count from README.md: {e}")
|
|
267
|
-
|
|
268
|
-
# Count agents in API.md subcommands
|
|
269
|
-
if self.api_path.exists():
|
|
270
|
-
try:
|
|
271
|
-
content = self.api_path.read_text(encoding="utf-8")
|
|
272
|
-
# Count subcommands
|
|
273
|
-
subcommand_matches = re.findall(
|
|
274
|
-
r"- `(\w+)` -", content
|
|
275
|
-
)
|
|
276
|
-
# Filter to only agent subcommands (exclude workflow, simple-mode, etc.)
|
|
277
|
-
agent_subcommands = [
|
|
278
|
-
m
|
|
279
|
-
for m in subcommand_matches
|
|
280
|
-
if m
|
|
281
|
-
not in [
|
|
282
|
-
"workflow",
|
|
283
|
-
"simple-mode",
|
|
284
|
-
"cursor",
|
|
285
|
-
"doctor",
|
|
286
|
-
"score",
|
|
287
|
-
"init",
|
|
288
|
-
"create",
|
|
289
|
-
]
|
|
290
|
-
]
|
|
291
|
-
counts["API.md"] = len(agent_subcommands)
|
|
292
|
-
except Exception as e:
|
|
293
|
-
logger.debug(f"Failed to extract count from API.md: {e}")
|
|
294
|
-
|
|
295
|
-
# Count agents in ARCHITECTURE.md
|
|
296
|
-
if self.arch_path.exists():
|
|
297
|
-
try:
|
|
298
|
-
content = self.arch_path.read_text(encoding="utf-8")
|
|
299
|
-
agent_matches = re.findall(
|
|
300
|
-
r"- \*\*(\w+) Agent\*\*", content
|
|
301
|
-
)
|
|
302
|
-
counts["ARCHITECTURE.md"] = len(agent_matches)
|
|
303
|
-
except Exception as e:
|
|
304
|
-
logger.debug(f"Failed to extract count from ARCHITECTURE.md: {e}")
|
|
305
|
-
|
|
306
|
-
# Count agents in agent-capabilities.mdc
|
|
307
|
-
if self.capabilities_path.exists():
|
|
308
|
-
try:
|
|
309
|
-
content = self.capabilities_path.read_text(encoding="utf-8")
|
|
310
|
-
agent_matches = re.findall(
|
|
311
|
-
r"### (\w+) Agent", content
|
|
312
|
-
)
|
|
313
|
-
counts["agent-capabilities.mdc"] = len(agent_matches)
|
|
314
|
-
except Exception as e:
|
|
315
|
-
logger.debug(
|
|
316
|
-
f"Failed to extract count from agent-capabilities.mdc: {e}"
|
|
317
|
-
)
|
|
318
|
-
|
|
319
|
-
result.counts = counts
|
|
320
|
-
|
|
321
|
-
# Check consistency
|
|
322
|
-
if len(counts) < 2:
|
|
323
|
-
result.is_consistent = False
|
|
324
|
-
result.discrepancies.append("Not enough documentation files to compare")
|
|
325
|
-
return result
|
|
326
|
-
|
|
327
|
-
# Get unique counts
|
|
328
|
-
unique_counts = set(counts.values())
|
|
329
|
-
if len(unique_counts) == 1:
|
|
330
|
-
result.is_consistent = True
|
|
331
|
-
else:
|
|
332
|
-
result.is_consistent = False
|
|
333
|
-
for doc_name, count in counts.items():
|
|
334
|
-
for other_doc, other_count in counts.items():
|
|
335
|
-
if doc_name != other_doc and count != other_count:
|
|
336
|
-
result.discrepancies.append(
|
|
337
|
-
f"{doc_name} has {count} agents, but {other_doc} has {other_count}"
|
|
338
|
-
)
|
|
339
|
-
|
|
340
|
-
return result
|
|
341
|
-
|
|
342
|
-
def generate_report(self, validation_result: ValidationResult) -> str:
|
|
343
|
-
"""
|
|
344
|
-
Generate validation report.
|
|
345
|
-
|
|
346
|
-
Args:
|
|
347
|
-
validation_result: Validation result to report
|
|
348
|
-
|
|
349
|
-
Returns:
|
|
350
|
-
Formatted validation report string
|
|
351
|
-
"""
|
|
352
|
-
report_lines = ["# Documentation Validation Report\n"]
|
|
353
|
-
|
|
354
|
-
# Status summary
|
|
355
|
-
status = "✅ PASS" if validation_result.is_complete else "❌ FAIL"
|
|
356
|
-
report_lines.append(f"**Status**: {status}\n")
|
|
357
|
-
|
|
358
|
-
# Individual checks
|
|
359
|
-
report_lines.append("## Individual Checks\n")
|
|
360
|
-
report_lines.append(f"- README.md: {'✅' if validation_result.readme_valid else '❌'}")
|
|
361
|
-
report_lines.append(f"- API.md: {'✅' if validation_result.api_valid else '❌'}")
|
|
362
|
-
report_lines.append(
|
|
363
|
-
f"- ARCHITECTURE.md: {'✅' if validation_result.architecture_valid else '❌'}"
|
|
364
|
-
)
|
|
365
|
-
report_lines.append(
|
|
366
|
-
f"- agent-capabilities.mdc: {'✅' if validation_result.capabilities_valid else '❌'}"
|
|
367
|
-
)
|
|
368
|
-
report_lines.append(
|
|
369
|
-
f"- Consistency: {'✅' if validation_result.consistency_valid else '❌'}\n"
|
|
370
|
-
)
|
|
371
|
-
|
|
372
|
-
# Agent counts
|
|
373
|
-
if validation_result.agent_count:
|
|
374
|
-
report_lines.append("## Agent Counts\n")
|
|
375
|
-
for doc_name, count in validation_result.agent_count.items():
|
|
376
|
-
report_lines.append(f"- {doc_name}: {count}")
|
|
377
|
-
report_lines.append("")
|
|
378
|
-
|
|
379
|
-
# Errors
|
|
380
|
-
if validation_result.errors:
|
|
381
|
-
report_lines.append("## Errors\n")
|
|
382
|
-
for error in validation_result.errors:
|
|
383
|
-
report_lines.append(f"- ❌ {error}")
|
|
384
|
-
report_lines.append("")
|
|
385
|
-
|
|
386
|
-
# Warnings
|
|
387
|
-
if validation_result.warnings:
|
|
388
|
-
report_lines.append("## Warnings\n")
|
|
389
|
-
for warning in validation_result.warnings:
|
|
390
|
-
report_lines.append(f"- ⚠️ {warning}")
|
|
391
|
-
report_lines.append("")
|
|
392
|
-
|
|
393
|
-
return "\n".join(report_lines)
|
|
1
|
+
"""
|
|
2
|
+
Documentation Validator - Validates documentation completeness and consistency.
|
|
3
|
+
|
|
4
|
+
This module validates that all project documentation is updated when new agents
|
|
5
|
+
are added to the framework.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
import re
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class ValidationResult:
|
|
19
|
+
"""Documentation validation result."""
|
|
20
|
+
|
|
21
|
+
readme_valid: bool = False
|
|
22
|
+
api_valid: bool = False
|
|
23
|
+
architecture_valid: bool = False
|
|
24
|
+
capabilities_valid: bool = False
|
|
25
|
+
consistency_valid: bool = False
|
|
26
|
+
agent_count: dict[str, int] = field(default_factory=dict)
|
|
27
|
+
errors: list[str] = field(default_factory=list)
|
|
28
|
+
warnings: list[str] = field(default_factory=list)
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
def is_complete(self) -> bool:
|
|
32
|
+
"""Check if all documentation is complete."""
|
|
33
|
+
return (
|
|
34
|
+
self.readme_valid
|
|
35
|
+
and self.api_valid
|
|
36
|
+
and self.architecture_valid
|
|
37
|
+
and self.capabilities_valid
|
|
38
|
+
and self.consistency_valid
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass
|
|
43
|
+
class ConsistencyResult:
|
|
44
|
+
"""Agent count consistency check result."""
|
|
45
|
+
|
|
46
|
+
is_consistent: bool = False
|
|
47
|
+
counts: dict[str, int] = field(default_factory=dict)
|
|
48
|
+
discrepancies: list[str] = field(default_factory=list)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class DocValidator:
|
|
52
|
+
"""Validate documentation completeness and consistency."""
|
|
53
|
+
|
|
54
|
+
def __init__(self, project_root: Path):
|
|
55
|
+
"""
|
|
56
|
+
Initialize documentation validator.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
project_root: Project root directory
|
|
60
|
+
"""
|
|
61
|
+
self.project_root = project_root
|
|
62
|
+
self.readme_path = project_root / "README.md"
|
|
63
|
+
self.api_path = project_root / "docs" / "API.md"
|
|
64
|
+
self.arch_path = project_root / "docs" / "ARCHITECTURE.md"
|
|
65
|
+
self.capabilities_path = (
|
|
66
|
+
project_root / ".cursor" / "rules" / "agent-capabilities.mdc"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def validate_completeness(self, agent_name: str) -> ValidationResult:
|
|
70
|
+
"""
|
|
71
|
+
Validate all documentation is complete for an agent.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
agent_name: Agent name to validate
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
ValidationResult with validation status
|
|
78
|
+
"""
|
|
79
|
+
result = ValidationResult()
|
|
80
|
+
|
|
81
|
+
# Validate each documentation file
|
|
82
|
+
result.readme_valid = self.validate_readme(agent_name)
|
|
83
|
+
result.api_valid = self.validate_api_docs(agent_name)
|
|
84
|
+
result.architecture_valid = self.validate_architecture_docs(agent_name)
|
|
85
|
+
result.capabilities_valid = self.validate_agent_capabilities(agent_name)
|
|
86
|
+
|
|
87
|
+
# Check consistency
|
|
88
|
+
consistency = self.check_consistency()
|
|
89
|
+
result.consistency_valid = consistency.is_consistent
|
|
90
|
+
result.agent_count = consistency.counts
|
|
91
|
+
|
|
92
|
+
# Collect errors and warnings
|
|
93
|
+
if not result.readme_valid:
|
|
94
|
+
result.errors.append(f"README.md does not mention {agent_name}")
|
|
95
|
+
if not result.api_valid:
|
|
96
|
+
result.errors.append(f"API.md does not document {agent_name}")
|
|
97
|
+
if not result.architecture_valid:
|
|
98
|
+
result.errors.append(f"ARCHITECTURE.md does not include {agent_name}")
|
|
99
|
+
if not result.capabilities_valid:
|
|
100
|
+
result.errors.append(
|
|
101
|
+
f"agent-capabilities.mdc does not have {agent_name} section"
|
|
102
|
+
)
|
|
103
|
+
if not result.consistency_valid:
|
|
104
|
+
result.warnings.append(
|
|
105
|
+
f"Agent count inconsistency: {consistency.discrepancies}"
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
return result
|
|
109
|
+
|
|
110
|
+
def validate_readme(
|
|
111
|
+
self, agent_name: str, readme_path: Path | None = None
|
|
112
|
+
) -> bool:
|
|
113
|
+
"""
|
|
114
|
+
Check README.md mentions agent.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
agent_name: Agent name to check
|
|
118
|
+
readme_path: README.md path (default: self.readme_path)
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
True if agent is mentioned in README.md
|
|
122
|
+
"""
|
|
123
|
+
if readme_path is None:
|
|
124
|
+
readme_path = self.readme_path
|
|
125
|
+
|
|
126
|
+
if not readme_path.exists():
|
|
127
|
+
logger.warning(f"README.md not found: {readme_path}")
|
|
128
|
+
return False
|
|
129
|
+
|
|
130
|
+
try:
|
|
131
|
+
content = readme_path.read_text(encoding="utf-8")
|
|
132
|
+
# Check for agent name in various patterns
|
|
133
|
+
patterns = [
|
|
134
|
+
rf"`@{agent_name}`", # @agent_name
|
|
135
|
+
rf"\b{agent_name}\b", # Word boundary
|
|
136
|
+
]
|
|
137
|
+
return any(re.search(pattern, content, re.IGNORECASE) for pattern in patterns)
|
|
138
|
+
except Exception as e:
|
|
139
|
+
logger.error(f"Failed to validate README.md: {e}")
|
|
140
|
+
return False
|
|
141
|
+
|
|
142
|
+
def validate_api_docs(
|
|
143
|
+
self, agent_name: str, api_path: Path | None = None
|
|
144
|
+
) -> bool:
|
|
145
|
+
"""
|
|
146
|
+
Check API.md documents agent.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
agent_name: Agent name to check
|
|
150
|
+
api_path: API.md path (default: self.api_path)
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
True if agent is documented in API.md
|
|
154
|
+
"""
|
|
155
|
+
if api_path is None:
|
|
156
|
+
api_path = self.api_path
|
|
157
|
+
|
|
158
|
+
if not api_path.exists():
|
|
159
|
+
logger.warning(f"API.md not found: {api_path}")
|
|
160
|
+
return False
|
|
161
|
+
|
|
162
|
+
try:
|
|
163
|
+
content = api_path.read_text(encoding="utf-8")
|
|
164
|
+
# Check for agent name in subcommands and API section
|
|
165
|
+
patterns = [
|
|
166
|
+
rf"- `{agent_name}`", # Subcommand
|
|
167
|
+
rf"## {agent_name.title()} Agent", # API section
|
|
168
|
+
rf"\b{agent_name}\b", # Word boundary
|
|
169
|
+
]
|
|
170
|
+
return any(re.search(pattern, content, re.IGNORECASE) for pattern in patterns)
|
|
171
|
+
except Exception as e:
|
|
172
|
+
logger.error(f"Failed to validate API.md: {e}")
|
|
173
|
+
return False
|
|
174
|
+
|
|
175
|
+
def validate_architecture_docs(
|
|
176
|
+
self, agent_name: str, arch_path: Path | None = None
|
|
177
|
+
) -> bool:
|
|
178
|
+
"""
|
|
179
|
+
Check ARCHITECTURE.md includes agent.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
agent_name: Agent name to check
|
|
183
|
+
arch_path: ARCHITECTURE.md path (default: self.arch_path)
|
|
184
|
+
|
|
185
|
+
Returns:
|
|
186
|
+
True if agent is included in ARCHITECTURE.md
|
|
187
|
+
"""
|
|
188
|
+
if arch_path is None:
|
|
189
|
+
arch_path = self.arch_path
|
|
190
|
+
|
|
191
|
+
if not arch_path.exists():
|
|
192
|
+
logger.warning(f"ARCHITECTURE.md not found: {arch_path}")
|
|
193
|
+
return False
|
|
194
|
+
|
|
195
|
+
try:
|
|
196
|
+
content = arch_path.read_text(encoding="utf-8")
|
|
197
|
+
# Check for agent name in agent list
|
|
198
|
+
# Convert snake_case to Title Case for matching
|
|
199
|
+
agent_name_title = agent_name.replace("_", " ").title()
|
|
200
|
+
patterns = [
|
|
201
|
+
rf"\*\*{re.escape(agent_name_title)} Agent\*\*", # **Agent Name Agent**
|
|
202
|
+
rf"\*\*{re.escape(agent_name.title())} Agent\*\*", # **Agent_Name Agent** (fallback)
|
|
203
|
+
rf"\b{agent_name}\b", # Word boundary
|
|
204
|
+
]
|
|
205
|
+
return any(re.search(pattern, content, re.IGNORECASE) for pattern in patterns)
|
|
206
|
+
except Exception as e:
|
|
207
|
+
logger.error(f"Failed to validate ARCHITECTURE.md: {e}")
|
|
208
|
+
return False
|
|
209
|
+
|
|
210
|
+
def validate_agent_capabilities(
|
|
211
|
+
self, agent_name: str, capabilities_path: Path | None = None
|
|
212
|
+
) -> bool:
|
|
213
|
+
"""
|
|
214
|
+
Check agent-capabilities.mdc has agent section.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
agent_name: Agent name to check
|
|
218
|
+
capabilities_path: agent-capabilities.mdc path (default: self.capabilities_path)
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
True if agent section exists in agent-capabilities.mdc
|
|
222
|
+
"""
|
|
223
|
+
if capabilities_path is None:
|
|
224
|
+
capabilities_path = self.capabilities_path
|
|
225
|
+
|
|
226
|
+
if not capabilities_path.exists():
|
|
227
|
+
logger.warning(f"agent-capabilities.mdc not found: {capabilities_path}")
|
|
228
|
+
return False
|
|
229
|
+
|
|
230
|
+
try:
|
|
231
|
+
content = capabilities_path.read_text(encoding="utf-8")
|
|
232
|
+
# Check for agent section heading
|
|
233
|
+
# Convert snake_case to Title Case for matching
|
|
234
|
+
agent_name_title = agent_name.replace("_", " ").title()
|
|
235
|
+
patterns = [
|
|
236
|
+
rf"### {re.escape(agent_name_title)} Agent", # ### Agent Name Agent
|
|
237
|
+
rf"### {re.escape(agent_name.title())} Agent", # ### Agent_Name Agent (fallback)
|
|
238
|
+
]
|
|
239
|
+
return any(re.search(pattern, content) for pattern in patterns)
|
|
240
|
+
except Exception as e:
|
|
241
|
+
logger.error(f"Failed to validate agent-capabilities.mdc: {e}")
|
|
242
|
+
return False
|
|
243
|
+
|
|
244
|
+
def check_consistency(self) -> ConsistencyResult:
|
|
245
|
+
"""
|
|
246
|
+
Check agent count consistency across all documentation.
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
ConsistencyResult with consistency status
|
|
250
|
+
"""
|
|
251
|
+
result = ConsistencyResult()
|
|
252
|
+
|
|
253
|
+
# Extract agent counts from each documentation file
|
|
254
|
+
counts = {}
|
|
255
|
+
|
|
256
|
+
# README.md
|
|
257
|
+
if self.readme_path.exists():
|
|
258
|
+
try:
|
|
259
|
+
content = self.readme_path.read_text(encoding="utf-8")
|
|
260
|
+
match = re.search(
|
|
261
|
+
r"- \*\*Workflow Agents\*\* \((\d+)\):", content
|
|
262
|
+
)
|
|
263
|
+
if match:
|
|
264
|
+
counts["README.md"] = int(match.group(1))
|
|
265
|
+
except Exception as e:
|
|
266
|
+
logger.debug(f"Failed to extract count from README.md: {e}")
|
|
267
|
+
|
|
268
|
+
# Count agents in API.md subcommands
|
|
269
|
+
if self.api_path.exists():
|
|
270
|
+
try:
|
|
271
|
+
content = self.api_path.read_text(encoding="utf-8")
|
|
272
|
+
# Count subcommands
|
|
273
|
+
subcommand_matches = re.findall(
|
|
274
|
+
r"- `(\w+)` -", content
|
|
275
|
+
)
|
|
276
|
+
# Filter to only agent subcommands (exclude workflow, simple-mode, etc.)
|
|
277
|
+
agent_subcommands = [
|
|
278
|
+
m
|
|
279
|
+
for m in subcommand_matches
|
|
280
|
+
if m
|
|
281
|
+
not in [
|
|
282
|
+
"workflow",
|
|
283
|
+
"simple-mode",
|
|
284
|
+
"cursor",
|
|
285
|
+
"doctor",
|
|
286
|
+
"score",
|
|
287
|
+
"init",
|
|
288
|
+
"create",
|
|
289
|
+
]
|
|
290
|
+
]
|
|
291
|
+
counts["API.md"] = len(agent_subcommands)
|
|
292
|
+
except Exception as e:
|
|
293
|
+
logger.debug(f"Failed to extract count from API.md: {e}")
|
|
294
|
+
|
|
295
|
+
# Count agents in ARCHITECTURE.md
|
|
296
|
+
if self.arch_path.exists():
|
|
297
|
+
try:
|
|
298
|
+
content = self.arch_path.read_text(encoding="utf-8")
|
|
299
|
+
agent_matches = re.findall(
|
|
300
|
+
r"- \*\*(\w+) Agent\*\*", content
|
|
301
|
+
)
|
|
302
|
+
counts["ARCHITECTURE.md"] = len(agent_matches)
|
|
303
|
+
except Exception as e:
|
|
304
|
+
logger.debug(f"Failed to extract count from ARCHITECTURE.md: {e}")
|
|
305
|
+
|
|
306
|
+
# Count agents in agent-capabilities.mdc
|
|
307
|
+
if self.capabilities_path.exists():
|
|
308
|
+
try:
|
|
309
|
+
content = self.capabilities_path.read_text(encoding="utf-8")
|
|
310
|
+
agent_matches = re.findall(
|
|
311
|
+
r"### (\w+) Agent", content
|
|
312
|
+
)
|
|
313
|
+
counts["agent-capabilities.mdc"] = len(agent_matches)
|
|
314
|
+
except Exception as e:
|
|
315
|
+
logger.debug(
|
|
316
|
+
f"Failed to extract count from agent-capabilities.mdc: {e}"
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
result.counts = counts
|
|
320
|
+
|
|
321
|
+
# Check consistency
|
|
322
|
+
if len(counts) < 2:
|
|
323
|
+
result.is_consistent = False
|
|
324
|
+
result.discrepancies.append("Not enough documentation files to compare")
|
|
325
|
+
return result
|
|
326
|
+
|
|
327
|
+
# Get unique counts
|
|
328
|
+
unique_counts = set(counts.values())
|
|
329
|
+
if len(unique_counts) == 1:
|
|
330
|
+
result.is_consistent = True
|
|
331
|
+
else:
|
|
332
|
+
result.is_consistent = False
|
|
333
|
+
for doc_name, count in counts.items():
|
|
334
|
+
for other_doc, other_count in counts.items():
|
|
335
|
+
if doc_name != other_doc and count != other_count:
|
|
336
|
+
result.discrepancies.append(
|
|
337
|
+
f"{doc_name} has {count} agents, but {other_doc} has {other_count}"
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
return result
|
|
341
|
+
|
|
342
|
+
def generate_report(self, validation_result: ValidationResult) -> str:
|
|
343
|
+
"""
|
|
344
|
+
Generate validation report.
|
|
345
|
+
|
|
346
|
+
Args:
|
|
347
|
+
validation_result: Validation result to report
|
|
348
|
+
|
|
349
|
+
Returns:
|
|
350
|
+
Formatted validation report string
|
|
351
|
+
"""
|
|
352
|
+
report_lines = ["# Documentation Validation Report\n"]
|
|
353
|
+
|
|
354
|
+
# Status summary
|
|
355
|
+
status = "✅ PASS" if validation_result.is_complete else "❌ FAIL"
|
|
356
|
+
report_lines.append(f"**Status**: {status}\n")
|
|
357
|
+
|
|
358
|
+
# Individual checks
|
|
359
|
+
report_lines.append("## Individual Checks\n")
|
|
360
|
+
report_lines.append(f"- README.md: {'✅' if validation_result.readme_valid else '❌'}")
|
|
361
|
+
report_lines.append(f"- API.md: {'✅' if validation_result.api_valid else '❌'}")
|
|
362
|
+
report_lines.append(
|
|
363
|
+
f"- ARCHITECTURE.md: {'✅' if validation_result.architecture_valid else '❌'}"
|
|
364
|
+
)
|
|
365
|
+
report_lines.append(
|
|
366
|
+
f"- agent-capabilities.mdc: {'✅' if validation_result.capabilities_valid else '❌'}"
|
|
367
|
+
)
|
|
368
|
+
report_lines.append(
|
|
369
|
+
f"- Consistency: {'✅' if validation_result.consistency_valid else '❌'}\n"
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
# Agent counts
|
|
373
|
+
if validation_result.agent_count:
|
|
374
|
+
report_lines.append("## Agent Counts\n")
|
|
375
|
+
for doc_name, count in validation_result.agent_count.items():
|
|
376
|
+
report_lines.append(f"- {doc_name}: {count}")
|
|
377
|
+
report_lines.append("")
|
|
378
|
+
|
|
379
|
+
# Errors
|
|
380
|
+
if validation_result.errors:
|
|
381
|
+
report_lines.append("## Errors\n")
|
|
382
|
+
for error in validation_result.errors:
|
|
383
|
+
report_lines.append(f"- ❌ {error}")
|
|
384
|
+
report_lines.append("")
|
|
385
|
+
|
|
386
|
+
# Warnings
|
|
387
|
+
if validation_result.warnings:
|
|
388
|
+
report_lines.append("## Warnings\n")
|
|
389
|
+
for warning in validation_result.warnings:
|
|
390
|
+
report_lines.append(f"- ⚠️ {warning}")
|
|
391
|
+
report_lines.append("")
|
|
392
|
+
|
|
393
|
+
return "\n".join(report_lines)
|