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,268 +1,268 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Framework Change Detector - Detects framework changes (new agents, etc.).
|
|
3
|
-
|
|
4
|
-
This module detects when new agents are added to the framework by scanning
|
|
5
|
-
agent directories, CLI registrations, and skill files.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import logging
|
|
9
|
-
import re
|
|
10
|
-
from dataclasses import dataclass, field
|
|
11
|
-
from datetime import datetime
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from typing import Any
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger(__name__)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@dataclass
|
|
19
|
-
class AgentInfo:
|
|
20
|
-
"""Agent metadata extracted from code."""
|
|
21
|
-
|
|
22
|
-
name: str
|
|
23
|
-
purpose: str | None = None
|
|
24
|
-
commands: list[str] = field(default_factory=list)
|
|
25
|
-
description: str | None = None
|
|
26
|
-
examples: list[str] = field(default_factory=list)
|
|
27
|
-
|
|
28
|
-
@classmethod
|
|
29
|
-
def from_agent_directory(cls, agent_dir: Path) -> "AgentInfo | None":
|
|
30
|
-
"""
|
|
31
|
-
Extract agent info from agent directory.
|
|
32
|
-
|
|
33
|
-
Args:
|
|
34
|
-
agent_dir: Agent directory path
|
|
35
|
-
|
|
36
|
-
Returns:
|
|
37
|
-
AgentInfo object, or None if extraction fails
|
|
38
|
-
"""
|
|
39
|
-
if not agent_dir.exists() or not agent_dir.is_dir():
|
|
40
|
-
return None
|
|
41
|
-
|
|
42
|
-
agent_name = agent_dir.name
|
|
43
|
-
agent_info = cls(name=agent_name)
|
|
44
|
-
|
|
45
|
-
# Try to extract purpose from agent.py docstring
|
|
46
|
-
agent_py = agent_dir / "agent.py"
|
|
47
|
-
if agent_py.exists():
|
|
48
|
-
try:
|
|
49
|
-
content = agent_py.read_text(encoding="utf-8")
|
|
50
|
-
# Extract class docstring
|
|
51
|
-
docstring_match = re.search(
|
|
52
|
-
r'class\s+\w+Agent.*?"""(.*?)"""', content, re.DOTALL
|
|
53
|
-
)
|
|
54
|
-
if docstring_match:
|
|
55
|
-
docstring = docstring_match.group(1).strip()
|
|
56
|
-
# Extract first line as purpose
|
|
57
|
-
first_line = docstring.split("\n")[0].strip()
|
|
58
|
-
if first_line:
|
|
59
|
-
agent_info.purpose = first_line
|
|
60
|
-
except Exception as e:
|
|
61
|
-
logger.debug(f"Failed to extract purpose from {agent_py}: {e}")
|
|
62
|
-
|
|
63
|
-
# Try to extract commands from SKILL.md
|
|
64
|
-
skill_md = agent_dir / "SKILL.md"
|
|
65
|
-
if not skill_md.exists():
|
|
66
|
-
# Check in resources/claude/skills/{agent_name}/
|
|
67
|
-
# More robust: find tapps_agents directory and build from there
|
|
68
|
-
# agent_dir is typically: .../tapps_agents/agents/{agent_name}/
|
|
69
|
-
# So agent_dir.parent.parent is: .../tapps_agents/
|
|
70
|
-
if agent_dir.parent.name == "agents" and agent_dir.parent.parent.name == "tapps_agents":
|
|
71
|
-
skill_md = (
|
|
72
|
-
agent_dir.parent.parent
|
|
73
|
-
/ "resources"
|
|
74
|
-
/ "claude"
|
|
75
|
-
/ "skills"
|
|
76
|
-
/ agent_name
|
|
77
|
-
/ "SKILL.md"
|
|
78
|
-
)
|
|
79
|
-
|
|
80
|
-
if skill_md.exists():
|
|
81
|
-
try:
|
|
82
|
-
content = skill_md.read_text(encoding="utf-8")
|
|
83
|
-
# Extract commands from markdown (look for command patterns like `*command` or `command`)
|
|
84
|
-
# Use a more specific pattern to reduce false positives
|
|
85
|
-
command_matches = re.findall(r"`\*?(\w+)`", content)
|
|
86
|
-
if command_matches:
|
|
87
|
-
# Preserve order while removing duplicates (use dict.fromkeys for Python 3.7+)
|
|
88
|
-
agent_info.commands = list(dict.fromkeys(command_matches))
|
|
89
|
-
except Exception as e:
|
|
90
|
-
logger.debug(f"Failed to extract commands from {skill_md}: {e}")
|
|
91
|
-
|
|
92
|
-
return agent_info
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
@dataclass
|
|
96
|
-
class FrameworkChanges:
|
|
97
|
-
"""Detected framework changes."""
|
|
98
|
-
|
|
99
|
-
new_agents: list[str] = field(default_factory=list)
|
|
100
|
-
modified_agents: list[str] = field(default_factory=list)
|
|
101
|
-
new_cli_commands: list[str] = field(default_factory=list)
|
|
102
|
-
timestamp: datetime = field(default_factory=datetime.now)
|
|
103
|
-
agent_info: dict[str, AgentInfo] = field(default_factory=dict)
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
class FrameworkChangeDetector:
|
|
107
|
-
"""Detect framework changes (new agents, modified agents, etc.)."""
|
|
108
|
-
|
|
109
|
-
def __init__(self, project_root: Path):
|
|
110
|
-
"""
|
|
111
|
-
Initialize framework change detector.
|
|
112
|
-
|
|
113
|
-
Args:
|
|
114
|
-
project_root: Project root directory
|
|
115
|
-
"""
|
|
116
|
-
self.project_root = project_root
|
|
117
|
-
self.agents_dir = project_root / "tapps_agents" / "agents"
|
|
118
|
-
self.cli_file = project_root / "tapps_agents" / "cli" / "main.py"
|
|
119
|
-
self.skills_dir = (
|
|
120
|
-
project_root / "tapps_agents" / "resources" / "claude" / "skills"
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
def detect_changes(
|
|
124
|
-
self, known_agents: set[str] | None = None
|
|
125
|
-
) -> FrameworkChanges:
|
|
126
|
-
"""
|
|
127
|
-
Detect framework changes since last check.
|
|
128
|
-
|
|
129
|
-
Args:
|
|
130
|
-
known_agents: Set of known agent names (from config or previous scan)
|
|
131
|
-
If None, will scan and return all current agents
|
|
132
|
-
|
|
133
|
-
Returns:
|
|
134
|
-
FrameworkChanges object with detected changes
|
|
135
|
-
"""
|
|
136
|
-
changes = FrameworkChanges()
|
|
137
|
-
|
|
138
|
-
# Scan for current agents
|
|
139
|
-
current_agents = self.scan_agent_directories()
|
|
140
|
-
|
|
141
|
-
if known_agents is None:
|
|
142
|
-
# No baseline, so all current agents are "new" (for initial setup)
|
|
143
|
-
changes.new_agents = current_agents
|
|
144
|
-
else:
|
|
145
|
-
# Compare with known agents
|
|
146
|
-
current_set = set(current_agents)
|
|
147
|
-
known_set = set(known_agents)
|
|
148
|
-
|
|
149
|
-
changes.new_agents = list(current_set - known_set)
|
|
150
|
-
# Note: Actual modification detection not yet implemented
|
|
151
|
-
# For now, keep modified_agents empty until we can detect actual changes
|
|
152
|
-
changes.modified_agents = []
|
|
153
|
-
|
|
154
|
-
# Extract agent info for new agents
|
|
155
|
-
for agent_name in changes.new_agents:
|
|
156
|
-
agent_dir = self.agents_dir / agent_name
|
|
157
|
-
agent_info = AgentInfo.from_agent_directory(agent_dir)
|
|
158
|
-
if agent_info:
|
|
159
|
-
changes.agent_info[agent_name] = agent_info
|
|
160
|
-
|
|
161
|
-
# Detect CLI registrations
|
|
162
|
-
for agent_name in changes.new_agents:
|
|
163
|
-
if self.detect_cli_registration(agent_name):
|
|
164
|
-
changes.new_cli_commands.append(agent_name)
|
|
165
|
-
|
|
166
|
-
return changes
|
|
167
|
-
|
|
168
|
-
def scan_agent_directories(
|
|
169
|
-
self, agents_dir: Path | None = None
|
|
170
|
-
) -> list[str]:
|
|
171
|
-
"""
|
|
172
|
-
Scan for agent directories in tapps_agents/agents/.
|
|
173
|
-
|
|
174
|
-
Args:
|
|
175
|
-
agents_dir: Agents directory path (default: self.agents_dir)
|
|
176
|
-
|
|
177
|
-
Returns:
|
|
178
|
-
List of agent names (directory names)
|
|
179
|
-
"""
|
|
180
|
-
if agents_dir is None:
|
|
181
|
-
agents_dir = self.agents_dir
|
|
182
|
-
|
|
183
|
-
if not agents_dir.exists():
|
|
184
|
-
# This is expected when the package is installed (not in development mode)
|
|
185
|
-
# Only log at debug level to avoid alarming users
|
|
186
|
-
logger.debug(f"Agents directory not found: {agents_dir} (expected when package is installed)")
|
|
187
|
-
return []
|
|
188
|
-
|
|
189
|
-
agents = []
|
|
190
|
-
try:
|
|
191
|
-
for item in agents_dir.iterdir():
|
|
192
|
-
if item.is_dir() and not item.name.startswith("__"):
|
|
193
|
-
# Check if it's a valid agent directory (has agent.py or __init__.py)
|
|
194
|
-
if (item / "agent.py").exists() or (item / "__init__.py").exists():
|
|
195
|
-
agents.append(item.name)
|
|
196
|
-
except PermissionError:
|
|
197
|
-
logger.warning(f"Permission denied when scanning agents directory: {agents_dir}")
|
|
198
|
-
except OSError as e:
|
|
199
|
-
logger.warning(f"OS error when scanning agents directory {agents_dir}: {e}")
|
|
200
|
-
|
|
201
|
-
return sorted(agents)
|
|
202
|
-
|
|
203
|
-
def detect_cli_registration(
|
|
204
|
-
self, agent_name: str, cli_file: Path | None = None
|
|
205
|
-
) -> bool:
|
|
206
|
-
"""
|
|
207
|
-
Check if agent is registered in CLI.
|
|
208
|
-
|
|
209
|
-
Args:
|
|
210
|
-
agent_name: Agent name to check
|
|
211
|
-
cli_file: CLI main file path (default: self.cli_file)
|
|
212
|
-
|
|
213
|
-
Returns:
|
|
214
|
-
True if agent is registered in CLI
|
|
215
|
-
"""
|
|
216
|
-
if cli_file is None:
|
|
217
|
-
cli_file = self.cli_file
|
|
218
|
-
|
|
219
|
-
if not cli_file.exists():
|
|
220
|
-
logger.debug(f"CLI file not found: {cli_file}")
|
|
221
|
-
return False
|
|
222
|
-
|
|
223
|
-
try:
|
|
224
|
-
content = cli_file.read_text(encoding="utf-8")
|
|
225
|
-
# Escape agent_name to handle special regex characters safely
|
|
226
|
-
escaped_name = re.escape(agent_name)
|
|
227
|
-
# Look for agent name in various patterns
|
|
228
|
-
patterns = [
|
|
229
|
-
rf'"{escaped_name}"', # String literal
|
|
230
|
-
rf"'{escaped_name}'", # String literal
|
|
231
|
-
rf"\b{escaped_name}\b", # Word boundary
|
|
232
|
-
]
|
|
233
|
-
return any(re.search(pattern, content) for pattern in patterns)
|
|
234
|
-
except Exception as e:
|
|
235
|
-
logger.warning(f"Failed to check CLI registration: {e}")
|
|
236
|
-
return False
|
|
237
|
-
|
|
238
|
-
def detect_skill_creation(
|
|
239
|
-
self, agent_name: str, skills_dir: Path | None = None
|
|
240
|
-
) -> bool:
|
|
241
|
-
"""
|
|
242
|
-
Check if agent skill file exists.
|
|
243
|
-
|
|
244
|
-
Args:
|
|
245
|
-
agent_name: Agent name to check
|
|
246
|
-
skills_dir: Skills directory path (default: self.skills_dir)
|
|
247
|
-
|
|
248
|
-
Returns:
|
|
249
|
-
True if agent skill file exists
|
|
250
|
-
"""
|
|
251
|
-
if skills_dir is None:
|
|
252
|
-
skills_dir = self.skills_dir
|
|
253
|
-
|
|
254
|
-
skill_file = skills_dir / agent_name / "SKILL.md"
|
|
255
|
-
return skill_file.exists()
|
|
256
|
-
|
|
257
|
-
def get_agent_info(self, agent_name: str) -> AgentInfo | None:
|
|
258
|
-
"""
|
|
259
|
-
Extract agent information from agent directory.
|
|
260
|
-
|
|
261
|
-
Args:
|
|
262
|
-
agent_name: Agent name
|
|
263
|
-
|
|
264
|
-
Returns:
|
|
265
|
-
AgentInfo object with agent metadata, or None if not found
|
|
266
|
-
"""
|
|
267
|
-
agent_dir = self.agents_dir / agent_name
|
|
268
|
-
return AgentInfo.from_agent_directory(agent_dir)
|
|
1
|
+
"""
|
|
2
|
+
Framework Change Detector - Detects framework changes (new agents, etc.).
|
|
3
|
+
|
|
4
|
+
This module detects when new agents are added to the framework by scanning
|
|
5
|
+
agent directories, CLI registrations, and skill files.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
import re
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass
|
|
19
|
+
class AgentInfo:
|
|
20
|
+
"""Agent metadata extracted from code."""
|
|
21
|
+
|
|
22
|
+
name: str
|
|
23
|
+
purpose: str | None = None
|
|
24
|
+
commands: list[str] = field(default_factory=list)
|
|
25
|
+
description: str | None = None
|
|
26
|
+
examples: list[str] = field(default_factory=list)
|
|
27
|
+
|
|
28
|
+
@classmethod
|
|
29
|
+
def from_agent_directory(cls, agent_dir: Path) -> "AgentInfo | None":
|
|
30
|
+
"""
|
|
31
|
+
Extract agent info from agent directory.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
agent_dir: Agent directory path
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
AgentInfo object, or None if extraction fails
|
|
38
|
+
"""
|
|
39
|
+
if not agent_dir.exists() or not agent_dir.is_dir():
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
agent_name = agent_dir.name
|
|
43
|
+
agent_info = cls(name=agent_name)
|
|
44
|
+
|
|
45
|
+
# Try to extract purpose from agent.py docstring
|
|
46
|
+
agent_py = agent_dir / "agent.py"
|
|
47
|
+
if agent_py.exists():
|
|
48
|
+
try:
|
|
49
|
+
content = agent_py.read_text(encoding="utf-8")
|
|
50
|
+
# Extract class docstring
|
|
51
|
+
docstring_match = re.search(
|
|
52
|
+
r'class\s+\w+Agent.*?"""(.*?)"""', content, re.DOTALL
|
|
53
|
+
)
|
|
54
|
+
if docstring_match:
|
|
55
|
+
docstring = docstring_match.group(1).strip()
|
|
56
|
+
# Extract first line as purpose
|
|
57
|
+
first_line = docstring.split("\n")[0].strip()
|
|
58
|
+
if first_line:
|
|
59
|
+
agent_info.purpose = first_line
|
|
60
|
+
except Exception as e:
|
|
61
|
+
logger.debug(f"Failed to extract purpose from {agent_py}: {e}")
|
|
62
|
+
|
|
63
|
+
# Try to extract commands from SKILL.md
|
|
64
|
+
skill_md = agent_dir / "SKILL.md"
|
|
65
|
+
if not skill_md.exists():
|
|
66
|
+
# Check in resources/claude/skills/{agent_name}/
|
|
67
|
+
# More robust: find tapps_agents directory and build from there
|
|
68
|
+
# agent_dir is typically: .../tapps_agents/agents/{agent_name}/
|
|
69
|
+
# So agent_dir.parent.parent is: .../tapps_agents/
|
|
70
|
+
if agent_dir.parent.name == "agents" and agent_dir.parent.parent.name == "tapps_agents":
|
|
71
|
+
skill_md = (
|
|
72
|
+
agent_dir.parent.parent
|
|
73
|
+
/ "resources"
|
|
74
|
+
/ "claude"
|
|
75
|
+
/ "skills"
|
|
76
|
+
/ agent_name
|
|
77
|
+
/ "SKILL.md"
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
if skill_md.exists():
|
|
81
|
+
try:
|
|
82
|
+
content = skill_md.read_text(encoding="utf-8")
|
|
83
|
+
# Extract commands from markdown (look for command patterns like `*command` or `command`)
|
|
84
|
+
# Use a more specific pattern to reduce false positives
|
|
85
|
+
command_matches = re.findall(r"`\*?(\w+)`", content)
|
|
86
|
+
if command_matches:
|
|
87
|
+
# Preserve order while removing duplicates (use dict.fromkeys for Python 3.7+)
|
|
88
|
+
agent_info.commands = list(dict.fromkeys(command_matches))
|
|
89
|
+
except Exception as e:
|
|
90
|
+
logger.debug(f"Failed to extract commands from {skill_md}: {e}")
|
|
91
|
+
|
|
92
|
+
return agent_info
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@dataclass
|
|
96
|
+
class FrameworkChanges:
|
|
97
|
+
"""Detected framework changes."""
|
|
98
|
+
|
|
99
|
+
new_agents: list[str] = field(default_factory=list)
|
|
100
|
+
modified_agents: list[str] = field(default_factory=list)
|
|
101
|
+
new_cli_commands: list[str] = field(default_factory=list)
|
|
102
|
+
timestamp: datetime = field(default_factory=datetime.now)
|
|
103
|
+
agent_info: dict[str, AgentInfo] = field(default_factory=dict)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class FrameworkChangeDetector:
|
|
107
|
+
"""Detect framework changes (new agents, modified agents, etc.)."""
|
|
108
|
+
|
|
109
|
+
def __init__(self, project_root: Path):
|
|
110
|
+
"""
|
|
111
|
+
Initialize framework change detector.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
project_root: Project root directory
|
|
115
|
+
"""
|
|
116
|
+
self.project_root = project_root
|
|
117
|
+
self.agents_dir = project_root / "tapps_agents" / "agents"
|
|
118
|
+
self.cli_file = project_root / "tapps_agents" / "cli" / "main.py"
|
|
119
|
+
self.skills_dir = (
|
|
120
|
+
project_root / "tapps_agents" / "resources" / "claude" / "skills"
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
def detect_changes(
|
|
124
|
+
self, known_agents: set[str] | None = None
|
|
125
|
+
) -> FrameworkChanges:
|
|
126
|
+
"""
|
|
127
|
+
Detect framework changes since last check.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
known_agents: Set of known agent names (from config or previous scan)
|
|
131
|
+
If None, will scan and return all current agents
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
FrameworkChanges object with detected changes
|
|
135
|
+
"""
|
|
136
|
+
changes = FrameworkChanges()
|
|
137
|
+
|
|
138
|
+
# Scan for current agents
|
|
139
|
+
current_agents = self.scan_agent_directories()
|
|
140
|
+
|
|
141
|
+
if known_agents is None:
|
|
142
|
+
# No baseline, so all current agents are "new" (for initial setup)
|
|
143
|
+
changes.new_agents = current_agents
|
|
144
|
+
else:
|
|
145
|
+
# Compare with known agents
|
|
146
|
+
current_set = set(current_agents)
|
|
147
|
+
known_set = set(known_agents)
|
|
148
|
+
|
|
149
|
+
changes.new_agents = list(current_set - known_set)
|
|
150
|
+
# Note: Actual modification detection not yet implemented
|
|
151
|
+
# For now, keep modified_agents empty until we can detect actual changes
|
|
152
|
+
changes.modified_agents = []
|
|
153
|
+
|
|
154
|
+
# Extract agent info for new agents
|
|
155
|
+
for agent_name in changes.new_agents:
|
|
156
|
+
agent_dir = self.agents_dir / agent_name
|
|
157
|
+
agent_info = AgentInfo.from_agent_directory(agent_dir)
|
|
158
|
+
if agent_info:
|
|
159
|
+
changes.agent_info[agent_name] = agent_info
|
|
160
|
+
|
|
161
|
+
# Detect CLI registrations
|
|
162
|
+
for agent_name in changes.new_agents:
|
|
163
|
+
if self.detect_cli_registration(agent_name):
|
|
164
|
+
changes.new_cli_commands.append(agent_name)
|
|
165
|
+
|
|
166
|
+
return changes
|
|
167
|
+
|
|
168
|
+
def scan_agent_directories(
|
|
169
|
+
self, agents_dir: Path | None = None
|
|
170
|
+
) -> list[str]:
|
|
171
|
+
"""
|
|
172
|
+
Scan for agent directories in tapps_agents/agents/.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
agents_dir: Agents directory path (default: self.agents_dir)
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
List of agent names (directory names)
|
|
179
|
+
"""
|
|
180
|
+
if agents_dir is None:
|
|
181
|
+
agents_dir = self.agents_dir
|
|
182
|
+
|
|
183
|
+
if not agents_dir.exists():
|
|
184
|
+
# This is expected when the package is installed (not in development mode)
|
|
185
|
+
# Only log at debug level to avoid alarming users
|
|
186
|
+
logger.debug(f"Agents directory not found: {agents_dir} (expected when package is installed)")
|
|
187
|
+
return []
|
|
188
|
+
|
|
189
|
+
agents = []
|
|
190
|
+
try:
|
|
191
|
+
for item in agents_dir.iterdir():
|
|
192
|
+
if item.is_dir() and not item.name.startswith("__"):
|
|
193
|
+
# Check if it's a valid agent directory (has agent.py or __init__.py)
|
|
194
|
+
if (item / "agent.py").exists() or (item / "__init__.py").exists():
|
|
195
|
+
agents.append(item.name)
|
|
196
|
+
except PermissionError:
|
|
197
|
+
logger.warning(f"Permission denied when scanning agents directory: {agents_dir}")
|
|
198
|
+
except OSError as e:
|
|
199
|
+
logger.warning(f"OS error when scanning agents directory {agents_dir}: {e}")
|
|
200
|
+
|
|
201
|
+
return sorted(agents)
|
|
202
|
+
|
|
203
|
+
def detect_cli_registration(
|
|
204
|
+
self, agent_name: str, cli_file: Path | None = None
|
|
205
|
+
) -> bool:
|
|
206
|
+
"""
|
|
207
|
+
Check if agent is registered in CLI.
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
agent_name: Agent name to check
|
|
211
|
+
cli_file: CLI main file path (default: self.cli_file)
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
True if agent is registered in CLI
|
|
215
|
+
"""
|
|
216
|
+
if cli_file is None:
|
|
217
|
+
cli_file = self.cli_file
|
|
218
|
+
|
|
219
|
+
if not cli_file.exists():
|
|
220
|
+
logger.debug(f"CLI file not found: {cli_file}")
|
|
221
|
+
return False
|
|
222
|
+
|
|
223
|
+
try:
|
|
224
|
+
content = cli_file.read_text(encoding="utf-8")
|
|
225
|
+
# Escape agent_name to handle special regex characters safely
|
|
226
|
+
escaped_name = re.escape(agent_name)
|
|
227
|
+
# Look for agent name in various patterns
|
|
228
|
+
patterns = [
|
|
229
|
+
rf'"{escaped_name}"', # String literal
|
|
230
|
+
rf"'{escaped_name}'", # String literal
|
|
231
|
+
rf"\b{escaped_name}\b", # Word boundary
|
|
232
|
+
]
|
|
233
|
+
return any(re.search(pattern, content) for pattern in patterns)
|
|
234
|
+
except Exception as e:
|
|
235
|
+
logger.warning(f"Failed to check CLI registration: {e}")
|
|
236
|
+
return False
|
|
237
|
+
|
|
238
|
+
def detect_skill_creation(
|
|
239
|
+
self, agent_name: str, skills_dir: Path | None = None
|
|
240
|
+
) -> bool:
|
|
241
|
+
"""
|
|
242
|
+
Check if agent skill file exists.
|
|
243
|
+
|
|
244
|
+
Args:
|
|
245
|
+
agent_name: Agent name to check
|
|
246
|
+
skills_dir: Skills directory path (default: self.skills_dir)
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
True if agent skill file exists
|
|
250
|
+
"""
|
|
251
|
+
if skills_dir is None:
|
|
252
|
+
skills_dir = self.skills_dir
|
|
253
|
+
|
|
254
|
+
skill_file = skills_dir / agent_name / "SKILL.md"
|
|
255
|
+
return skill_file.exists()
|
|
256
|
+
|
|
257
|
+
def get_agent_info(self, agent_name: str) -> AgentInfo | None:
|
|
258
|
+
"""
|
|
259
|
+
Extract agent information from agent directory.
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
agent_name: Agent name
|
|
263
|
+
|
|
264
|
+
Returns:
|
|
265
|
+
AgentInfo object with agent metadata, or None if not found
|
|
266
|
+
"""
|
|
267
|
+
agent_dir = self.agents_dir / agent_name
|
|
268
|
+
return AgentInfo.from_agent_directory(agent_dir)
|