attune-ai 2.0.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.
- attune/__init__.py +358 -0
- attune/adaptive/__init__.py +13 -0
- attune/adaptive/task_complexity.py +127 -0
- attune/agent_monitoring.py +414 -0
- attune/cache/__init__.py +117 -0
- attune/cache/base.py +166 -0
- attune/cache/dependency_manager.py +256 -0
- attune/cache/hash_only.py +251 -0
- attune/cache/hybrid.py +457 -0
- attune/cache/storage.py +285 -0
- attune/cache_monitor.py +356 -0
- attune/cache_stats.py +298 -0
- attune/cli/__init__.py +152 -0
- attune/cli/__main__.py +12 -0
- attune/cli/commands/__init__.py +1 -0
- attune/cli/commands/batch.py +264 -0
- attune/cli/commands/cache.py +248 -0
- attune/cli/commands/help.py +331 -0
- attune/cli/commands/info.py +140 -0
- attune/cli/commands/inspect.py +436 -0
- attune/cli/commands/inspection.py +57 -0
- attune/cli/commands/memory.py +48 -0
- attune/cli/commands/metrics.py +92 -0
- attune/cli/commands/orchestrate.py +184 -0
- attune/cli/commands/patterns.py +207 -0
- attune/cli/commands/profiling.py +202 -0
- attune/cli/commands/provider.py +98 -0
- attune/cli/commands/routing.py +285 -0
- attune/cli/commands/setup.py +96 -0
- attune/cli/commands/status.py +235 -0
- attune/cli/commands/sync.py +166 -0
- attune/cli/commands/tier.py +121 -0
- attune/cli/commands/utilities.py +114 -0
- attune/cli/commands/workflow.py +579 -0
- attune/cli/core.py +32 -0
- attune/cli/parsers/__init__.py +68 -0
- attune/cli/parsers/batch.py +118 -0
- attune/cli/parsers/cache.py +65 -0
- attune/cli/parsers/help.py +41 -0
- attune/cli/parsers/info.py +26 -0
- attune/cli/parsers/inspect.py +66 -0
- attune/cli/parsers/metrics.py +42 -0
- attune/cli/parsers/orchestrate.py +61 -0
- attune/cli/parsers/patterns.py +54 -0
- attune/cli/parsers/provider.py +40 -0
- attune/cli/parsers/routing.py +110 -0
- attune/cli/parsers/setup.py +42 -0
- attune/cli/parsers/status.py +47 -0
- attune/cli/parsers/sync.py +31 -0
- attune/cli/parsers/tier.py +33 -0
- attune/cli/parsers/workflow.py +77 -0
- attune/cli/utils/__init__.py +1 -0
- attune/cli/utils/data.py +242 -0
- attune/cli/utils/helpers.py +68 -0
- attune/cli_legacy.py +3957 -0
- attune/cli_minimal.py +1159 -0
- attune/cli_router.py +437 -0
- attune/cli_unified.py +814 -0
- attune/config/__init__.py +66 -0
- attune/config/xml_config.py +286 -0
- attune/config.py +545 -0
- attune/coordination.py +870 -0
- attune/core.py +1511 -0
- attune/core_modules/__init__.py +15 -0
- attune/cost_tracker.py +626 -0
- attune/dashboard/__init__.py +41 -0
- attune/dashboard/app.py +512 -0
- attune/dashboard/simple_server.py +435 -0
- attune/dashboard/standalone_server.py +547 -0
- attune/discovery.py +306 -0
- attune/emergence.py +306 -0
- attune/exceptions.py +123 -0
- attune/feedback_loops.py +373 -0
- attune/hot_reload/README.md +473 -0
- attune/hot_reload/__init__.py +62 -0
- attune/hot_reload/config.py +83 -0
- attune/hot_reload/integration.py +229 -0
- attune/hot_reload/reloader.py +298 -0
- attune/hot_reload/watcher.py +183 -0
- attune/hot_reload/websocket.py +177 -0
- attune/levels.py +577 -0
- attune/leverage_points.py +441 -0
- attune/logging_config.py +261 -0
- attune/mcp/__init__.py +10 -0
- attune/mcp/server.py +506 -0
- attune/memory/__init__.py +237 -0
- attune/memory/claude_memory.py +469 -0
- attune/memory/config.py +224 -0
- attune/memory/control_panel.py +1290 -0
- attune/memory/control_panel_support.py +145 -0
- attune/memory/cross_session.py +845 -0
- attune/memory/edges.py +179 -0
- attune/memory/encryption.py +159 -0
- attune/memory/file_session.py +770 -0
- attune/memory/graph.py +570 -0
- attune/memory/long_term.py +913 -0
- attune/memory/long_term_types.py +99 -0
- attune/memory/mixins/__init__.py +25 -0
- attune/memory/mixins/backend_init_mixin.py +249 -0
- attune/memory/mixins/capabilities_mixin.py +208 -0
- attune/memory/mixins/handoff_mixin.py +208 -0
- attune/memory/mixins/lifecycle_mixin.py +49 -0
- attune/memory/mixins/long_term_mixin.py +352 -0
- attune/memory/mixins/promotion_mixin.py +109 -0
- attune/memory/mixins/short_term_mixin.py +182 -0
- attune/memory/nodes.py +179 -0
- attune/memory/redis_bootstrap.py +540 -0
- attune/memory/security/__init__.py +31 -0
- attune/memory/security/audit_logger.py +932 -0
- attune/memory/security/pii_scrubber.py +640 -0
- attune/memory/security/secrets_detector.py +678 -0
- attune/memory/short_term.py +2192 -0
- attune/memory/simple_storage.py +302 -0
- attune/memory/storage/__init__.py +15 -0
- attune/memory/storage_backend.py +167 -0
- attune/memory/summary_index.py +583 -0
- attune/memory/types.py +446 -0
- attune/memory/unified.py +182 -0
- attune/meta_workflows/__init__.py +74 -0
- attune/meta_workflows/agent_creator.py +248 -0
- attune/meta_workflows/builtin_templates.py +567 -0
- attune/meta_workflows/cli_commands/__init__.py +56 -0
- attune/meta_workflows/cli_commands/agent_commands.py +321 -0
- attune/meta_workflows/cli_commands/analytics_commands.py +442 -0
- attune/meta_workflows/cli_commands/config_commands.py +232 -0
- attune/meta_workflows/cli_commands/memory_commands.py +182 -0
- attune/meta_workflows/cli_commands/template_commands.py +354 -0
- attune/meta_workflows/cli_commands/workflow_commands.py +382 -0
- attune/meta_workflows/cli_meta_workflows.py +59 -0
- attune/meta_workflows/form_engine.py +292 -0
- attune/meta_workflows/intent_detector.py +409 -0
- attune/meta_workflows/models.py +569 -0
- attune/meta_workflows/pattern_learner.py +738 -0
- attune/meta_workflows/plan_generator.py +384 -0
- attune/meta_workflows/session_context.py +397 -0
- attune/meta_workflows/template_registry.py +229 -0
- attune/meta_workflows/workflow.py +984 -0
- attune/metrics/__init__.py +12 -0
- attune/metrics/collector.py +31 -0
- attune/metrics/prompt_metrics.py +194 -0
- attune/models/__init__.py +172 -0
- attune/models/__main__.py +13 -0
- attune/models/adaptive_routing.py +437 -0
- attune/models/auth_cli.py +444 -0
- attune/models/auth_strategy.py +450 -0
- attune/models/cli.py +655 -0
- attune/models/empathy_executor.py +354 -0
- attune/models/executor.py +257 -0
- attune/models/fallback.py +762 -0
- attune/models/provider_config.py +282 -0
- attune/models/registry.py +472 -0
- attune/models/tasks.py +359 -0
- attune/models/telemetry/__init__.py +71 -0
- attune/models/telemetry/analytics.py +594 -0
- attune/models/telemetry/backend.py +196 -0
- attune/models/telemetry/data_models.py +431 -0
- attune/models/telemetry/storage.py +489 -0
- attune/models/token_estimator.py +420 -0
- attune/models/validation.py +280 -0
- attune/monitoring/__init__.py +52 -0
- attune/monitoring/alerts.py +946 -0
- attune/monitoring/alerts_cli.py +448 -0
- attune/monitoring/multi_backend.py +271 -0
- attune/monitoring/otel_backend.py +362 -0
- attune/optimization/__init__.py +19 -0
- attune/optimization/context_optimizer.py +272 -0
- attune/orchestration/__init__.py +67 -0
- attune/orchestration/agent_templates.py +707 -0
- attune/orchestration/config_store.py +499 -0
- attune/orchestration/execution_strategies.py +2111 -0
- attune/orchestration/meta_orchestrator.py +1168 -0
- attune/orchestration/pattern_learner.py +696 -0
- attune/orchestration/real_tools.py +931 -0
- attune/pattern_cache.py +187 -0
- attune/pattern_library.py +542 -0
- attune/patterns/debugging/all_patterns.json +81 -0
- attune/patterns/debugging/workflow_20260107_1770825e.json +77 -0
- attune/patterns/refactoring_memory.json +89 -0
- attune/persistence.py +564 -0
- attune/platform_utils.py +265 -0
- attune/plugins/__init__.py +28 -0
- attune/plugins/base.py +361 -0
- attune/plugins/registry.py +268 -0
- attune/project_index/__init__.py +32 -0
- attune/project_index/cli.py +335 -0
- attune/project_index/index.py +667 -0
- attune/project_index/models.py +504 -0
- attune/project_index/reports.py +474 -0
- attune/project_index/scanner.py +777 -0
- attune/project_index/scanner_parallel.py +291 -0
- attune/prompts/__init__.py +61 -0
- attune/prompts/config.py +77 -0
- attune/prompts/context.py +177 -0
- attune/prompts/parser.py +285 -0
- attune/prompts/registry.py +313 -0
- attune/prompts/templates.py +208 -0
- attune/redis_config.py +302 -0
- attune/redis_memory.py +799 -0
- attune/resilience/__init__.py +56 -0
- attune/resilience/circuit_breaker.py +256 -0
- attune/resilience/fallback.py +179 -0
- attune/resilience/health.py +300 -0
- attune/resilience/retry.py +209 -0
- attune/resilience/timeout.py +135 -0
- attune/routing/__init__.py +43 -0
- attune/routing/chain_executor.py +433 -0
- attune/routing/classifier.py +217 -0
- attune/routing/smart_router.py +234 -0
- attune/routing/workflow_registry.py +343 -0
- attune/scaffolding/README.md +589 -0
- attune/scaffolding/__init__.py +35 -0
- attune/scaffolding/__main__.py +14 -0
- attune/scaffolding/cli.py +240 -0
- attune/scaffolding/templates/base_wizard.py.jinja2 +121 -0
- attune/scaffolding/templates/coach_wizard.py.jinja2 +321 -0
- attune/scaffolding/templates/domain_wizard.py.jinja2 +408 -0
- attune/scaffolding/templates/linear_flow_wizard.py.jinja2 +203 -0
- attune/socratic/__init__.py +256 -0
- attune/socratic/ab_testing.py +958 -0
- attune/socratic/blueprint.py +533 -0
- attune/socratic/cli.py +703 -0
- attune/socratic/collaboration.py +1114 -0
- attune/socratic/domain_templates.py +924 -0
- attune/socratic/embeddings.py +738 -0
- attune/socratic/engine.py +794 -0
- attune/socratic/explainer.py +682 -0
- attune/socratic/feedback.py +772 -0
- attune/socratic/forms.py +629 -0
- attune/socratic/generator.py +732 -0
- attune/socratic/llm_analyzer.py +637 -0
- attune/socratic/mcp_server.py +702 -0
- attune/socratic/session.py +312 -0
- attune/socratic/storage.py +667 -0
- attune/socratic/success.py +730 -0
- attune/socratic/visual_editor.py +860 -0
- attune/socratic/web_ui.py +958 -0
- attune/telemetry/__init__.py +39 -0
- attune/telemetry/agent_coordination.py +475 -0
- attune/telemetry/agent_tracking.py +367 -0
- attune/telemetry/approval_gates.py +545 -0
- attune/telemetry/cli.py +1231 -0
- attune/telemetry/commands/__init__.py +14 -0
- attune/telemetry/commands/dashboard_commands.py +696 -0
- attune/telemetry/event_streaming.py +409 -0
- attune/telemetry/feedback_loop.py +567 -0
- attune/telemetry/usage_tracker.py +591 -0
- attune/templates.py +754 -0
- attune/test_generator/__init__.py +38 -0
- attune/test_generator/__main__.py +14 -0
- attune/test_generator/cli.py +234 -0
- attune/test_generator/generator.py +355 -0
- attune/test_generator/risk_analyzer.py +216 -0
- attune/test_generator/templates/unit_test.py.jinja2 +272 -0
- attune/tier_recommender.py +384 -0
- attune/tools.py +183 -0
- attune/trust/__init__.py +28 -0
- attune/trust/circuit_breaker.py +579 -0
- attune/trust_building.py +527 -0
- attune/validation/__init__.py +19 -0
- attune/validation/xml_validator.py +281 -0
- attune/vscode_bridge.py +173 -0
- attune/workflow_commands.py +780 -0
- attune/workflow_patterns/__init__.py +33 -0
- attune/workflow_patterns/behavior.py +249 -0
- attune/workflow_patterns/core.py +76 -0
- attune/workflow_patterns/output.py +99 -0
- attune/workflow_patterns/registry.py +255 -0
- attune/workflow_patterns/structural.py +288 -0
- attune/workflows/__init__.py +539 -0
- attune/workflows/autonomous_test_gen.py +1268 -0
- attune/workflows/base.py +2667 -0
- attune/workflows/batch_processing.py +342 -0
- attune/workflows/bug_predict.py +1084 -0
- attune/workflows/builder.py +273 -0
- attune/workflows/caching.py +253 -0
- attune/workflows/code_review.py +1048 -0
- attune/workflows/code_review_adapters.py +312 -0
- attune/workflows/code_review_pipeline.py +722 -0
- attune/workflows/config.py +645 -0
- attune/workflows/dependency_check.py +644 -0
- attune/workflows/document_gen/__init__.py +25 -0
- attune/workflows/document_gen/config.py +30 -0
- attune/workflows/document_gen/report_formatter.py +162 -0
- attune/workflows/document_gen/workflow.py +1426 -0
- attune/workflows/document_manager.py +216 -0
- attune/workflows/document_manager_README.md +134 -0
- attune/workflows/documentation_orchestrator.py +1205 -0
- attune/workflows/history.py +510 -0
- attune/workflows/keyboard_shortcuts/__init__.py +39 -0
- attune/workflows/keyboard_shortcuts/generators.py +391 -0
- attune/workflows/keyboard_shortcuts/parsers.py +416 -0
- attune/workflows/keyboard_shortcuts/prompts.py +295 -0
- attune/workflows/keyboard_shortcuts/schema.py +193 -0
- attune/workflows/keyboard_shortcuts/workflow.py +509 -0
- attune/workflows/llm_base.py +363 -0
- attune/workflows/manage_docs.py +87 -0
- attune/workflows/manage_docs_README.md +134 -0
- attune/workflows/manage_documentation.py +821 -0
- attune/workflows/new_sample_workflow1.py +149 -0
- attune/workflows/new_sample_workflow1_README.md +150 -0
- attune/workflows/orchestrated_health_check.py +849 -0
- attune/workflows/orchestrated_release_prep.py +600 -0
- attune/workflows/output.py +413 -0
- attune/workflows/perf_audit.py +863 -0
- attune/workflows/pr_review.py +762 -0
- attune/workflows/progress.py +785 -0
- attune/workflows/progress_server.py +322 -0
- attune/workflows/progressive/README 2.md +454 -0
- attune/workflows/progressive/README.md +454 -0
- attune/workflows/progressive/__init__.py +82 -0
- attune/workflows/progressive/cli.py +219 -0
- attune/workflows/progressive/core.py +488 -0
- attune/workflows/progressive/orchestrator.py +723 -0
- attune/workflows/progressive/reports.py +520 -0
- attune/workflows/progressive/telemetry.py +274 -0
- attune/workflows/progressive/test_gen.py +495 -0
- attune/workflows/progressive/workflow.py +589 -0
- attune/workflows/refactor_plan.py +694 -0
- attune/workflows/release_prep.py +895 -0
- attune/workflows/release_prep_crew.py +969 -0
- attune/workflows/research_synthesis.py +404 -0
- attune/workflows/routing.py +168 -0
- attune/workflows/secure_release.py +593 -0
- attune/workflows/security_adapters.py +297 -0
- attune/workflows/security_audit.py +1329 -0
- attune/workflows/security_audit_phase3.py +355 -0
- attune/workflows/seo_optimization.py +633 -0
- attune/workflows/step_config.py +234 -0
- attune/workflows/telemetry_mixin.py +269 -0
- attune/workflows/test5.py +125 -0
- attune/workflows/test5_README.md +158 -0
- attune/workflows/test_coverage_boost_crew.py +849 -0
- attune/workflows/test_gen/__init__.py +52 -0
- attune/workflows/test_gen/ast_analyzer.py +249 -0
- attune/workflows/test_gen/config.py +88 -0
- attune/workflows/test_gen/data_models.py +38 -0
- attune/workflows/test_gen/report_formatter.py +289 -0
- attune/workflows/test_gen/test_templates.py +381 -0
- attune/workflows/test_gen/workflow.py +655 -0
- attune/workflows/test_gen.py +54 -0
- attune/workflows/test_gen_behavioral.py +477 -0
- attune/workflows/test_gen_parallel.py +341 -0
- attune/workflows/test_lifecycle.py +526 -0
- attune/workflows/test_maintenance.py +627 -0
- attune/workflows/test_maintenance_cli.py +590 -0
- attune/workflows/test_maintenance_crew.py +840 -0
- attune/workflows/test_runner.py +622 -0
- attune/workflows/tier_tracking.py +531 -0
- attune/workflows/xml_enhanced_crew.py +285 -0
- attune_ai-2.0.0.dist-info/METADATA +1026 -0
- attune_ai-2.0.0.dist-info/RECORD +457 -0
- attune_ai-2.0.0.dist-info/WHEEL +5 -0
- attune_ai-2.0.0.dist-info/entry_points.txt +26 -0
- attune_ai-2.0.0.dist-info/licenses/LICENSE +201 -0
- attune_ai-2.0.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +101 -0
- attune_ai-2.0.0.dist-info/top_level.txt +5 -0
- attune_healthcare/__init__.py +13 -0
- attune_healthcare/monitors/__init__.py +9 -0
- attune_healthcare/monitors/clinical_protocol_monitor.py +315 -0
- attune_healthcare/monitors/monitoring/__init__.py +44 -0
- attune_healthcare/monitors/monitoring/protocol_checker.py +300 -0
- attune_healthcare/monitors/monitoring/protocol_loader.py +214 -0
- attune_healthcare/monitors/monitoring/sensor_parsers.py +306 -0
- attune_healthcare/monitors/monitoring/trajectory_analyzer.py +389 -0
- attune_llm/README.md +553 -0
- attune_llm/__init__.py +28 -0
- attune_llm/agent_factory/__init__.py +53 -0
- attune_llm/agent_factory/adapters/__init__.py +85 -0
- attune_llm/agent_factory/adapters/autogen_adapter.py +312 -0
- attune_llm/agent_factory/adapters/crewai_adapter.py +483 -0
- attune_llm/agent_factory/adapters/haystack_adapter.py +298 -0
- attune_llm/agent_factory/adapters/langchain_adapter.py +362 -0
- attune_llm/agent_factory/adapters/langgraph_adapter.py +333 -0
- attune_llm/agent_factory/adapters/native.py +228 -0
- attune_llm/agent_factory/adapters/wizard_adapter.py +423 -0
- attune_llm/agent_factory/base.py +305 -0
- attune_llm/agent_factory/crews/__init__.py +67 -0
- attune_llm/agent_factory/crews/code_review.py +1113 -0
- attune_llm/agent_factory/crews/health_check.py +1262 -0
- attune_llm/agent_factory/crews/refactoring.py +1128 -0
- attune_llm/agent_factory/crews/security_audit.py +1018 -0
- attune_llm/agent_factory/decorators.py +287 -0
- attune_llm/agent_factory/factory.py +558 -0
- attune_llm/agent_factory/framework.py +193 -0
- attune_llm/agent_factory/memory_integration.py +328 -0
- attune_llm/agent_factory/resilient.py +320 -0
- attune_llm/agents_md/__init__.py +22 -0
- attune_llm/agents_md/loader.py +218 -0
- attune_llm/agents_md/parser.py +271 -0
- attune_llm/agents_md/registry.py +307 -0
- attune_llm/claude_memory.py +466 -0
- attune_llm/cli/__init__.py +8 -0
- attune_llm/cli/sync_claude.py +487 -0
- attune_llm/code_health.py +1313 -0
- attune_llm/commands/__init__.py +51 -0
- attune_llm/commands/context.py +375 -0
- attune_llm/commands/loader.py +301 -0
- attune_llm/commands/models.py +231 -0
- attune_llm/commands/parser.py +371 -0
- attune_llm/commands/registry.py +429 -0
- attune_llm/config/__init__.py +29 -0
- attune_llm/config/unified.py +291 -0
- attune_llm/context/__init__.py +22 -0
- attune_llm/context/compaction.py +455 -0
- attune_llm/context/manager.py +434 -0
- attune_llm/contextual_patterns.py +361 -0
- attune_llm/core.py +907 -0
- attune_llm/git_pattern_extractor.py +435 -0
- attune_llm/hooks/__init__.py +24 -0
- attune_llm/hooks/config.py +306 -0
- attune_llm/hooks/executor.py +289 -0
- attune_llm/hooks/registry.py +302 -0
- attune_llm/hooks/scripts/__init__.py +39 -0
- attune_llm/hooks/scripts/evaluate_session.py +201 -0
- attune_llm/hooks/scripts/first_time_init.py +285 -0
- attune_llm/hooks/scripts/pre_compact.py +207 -0
- attune_llm/hooks/scripts/session_end.py +183 -0
- attune_llm/hooks/scripts/session_start.py +163 -0
- attune_llm/hooks/scripts/suggest_compact.py +225 -0
- attune_llm/learning/__init__.py +30 -0
- attune_llm/learning/evaluator.py +438 -0
- attune_llm/learning/extractor.py +514 -0
- attune_llm/learning/storage.py +560 -0
- attune_llm/levels.py +227 -0
- attune_llm/pattern_confidence.py +414 -0
- attune_llm/pattern_resolver.py +272 -0
- attune_llm/pattern_summary.py +350 -0
- attune_llm/providers.py +967 -0
- attune_llm/routing/__init__.py +32 -0
- attune_llm/routing/model_router.py +362 -0
- attune_llm/security/IMPLEMENTATION_SUMMARY.md +413 -0
- attune_llm/security/PHASE2_COMPLETE.md +384 -0
- attune_llm/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- attune_llm/security/QUICK_REFERENCE.md +316 -0
- attune_llm/security/README.md +262 -0
- attune_llm/security/__init__.py +62 -0
- attune_llm/security/audit_logger.py +929 -0
- attune_llm/security/audit_logger_example.py +152 -0
- attune_llm/security/pii_scrubber.py +640 -0
- attune_llm/security/secrets_detector.py +678 -0
- attune_llm/security/secrets_detector_example.py +304 -0
- attune_llm/security/secure_memdocs.py +1192 -0
- attune_llm/security/secure_memdocs_example.py +278 -0
- attune_llm/session_status.py +745 -0
- attune_llm/state.py +246 -0
- attune_llm/utils/__init__.py +5 -0
- attune_llm/utils/tokens.py +349 -0
- attune_software/SOFTWARE_PLUGIN_README.md +57 -0
- attune_software/__init__.py +13 -0
- attune_software/cli/__init__.py +120 -0
- attune_software/cli/inspect.py +362 -0
- attune_software/cli.py +574 -0
- attune_software/plugin.py +188 -0
- workflow_scaffolding/__init__.py +11 -0
- workflow_scaffolding/__main__.py +12 -0
- workflow_scaffolding/cli.py +206 -0
- workflow_scaffolding/generator.py +265 -0
|
@@ -0,0 +1,707 @@
|
|
|
1
|
+
"""Agent template system for meta-orchestration.
|
|
2
|
+
|
|
3
|
+
This module provides reusable agent archetypes that can be customized
|
|
4
|
+
for specific tasks. Templates define agent capabilities, tools, and
|
|
5
|
+
quality gates.
|
|
6
|
+
|
|
7
|
+
Security:
|
|
8
|
+
- All template fields validated on creation
|
|
9
|
+
- No eval() or exec() usage
|
|
10
|
+
- Input sanitization on template lookup
|
|
11
|
+
|
|
12
|
+
Example:
|
|
13
|
+
>>> template = get_template("test_coverage_analyzer")
|
|
14
|
+
>>> print(template.role)
|
|
15
|
+
Test Coverage Expert
|
|
16
|
+
|
|
17
|
+
>>> templates = get_templates_by_capability("analyze_gaps")
|
|
18
|
+
>>> print([t.id for t in templates])
|
|
19
|
+
['test_coverage_analyzer']
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import logging
|
|
23
|
+
from dataclasses import dataclass, field
|
|
24
|
+
from typing import Any
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass(frozen=True)
|
|
30
|
+
class AgentCapability:
|
|
31
|
+
"""Capability that an agent can perform.
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
name: Capability identifier (e.g., "analyze_gaps")
|
|
35
|
+
description: Human-readable description
|
|
36
|
+
required_tools: List of tools needed for this capability
|
|
37
|
+
|
|
38
|
+
Example:
|
|
39
|
+
>>> cap = AgentCapability(
|
|
40
|
+
... name="analyze_gaps",
|
|
41
|
+
... description="Identify test coverage gaps",
|
|
42
|
+
... required_tools=["coverage_analyzer"]
|
|
43
|
+
... )
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
name: str
|
|
47
|
+
description: str
|
|
48
|
+
required_tools: list[str] = field(default_factory=list)
|
|
49
|
+
|
|
50
|
+
def __post_init__(self):
|
|
51
|
+
"""Validate capability fields."""
|
|
52
|
+
if not self.name or not isinstance(self.name, str):
|
|
53
|
+
raise ValueError("name must be a non-empty string")
|
|
54
|
+
if not self.description or not isinstance(self.description, str):
|
|
55
|
+
raise ValueError("description must be a non-empty string")
|
|
56
|
+
if not isinstance(self.required_tools, list):
|
|
57
|
+
raise ValueError("required_tools must be a list")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass(frozen=True)
|
|
61
|
+
class ResourceRequirements:
|
|
62
|
+
"""Resource requirements for agent execution.
|
|
63
|
+
|
|
64
|
+
Attributes:
|
|
65
|
+
min_tokens: Minimum token budget required
|
|
66
|
+
max_tokens: Maximum token budget allowed
|
|
67
|
+
timeout_seconds: Maximum execution time in seconds
|
|
68
|
+
memory_mb: Maximum memory usage in megabytes
|
|
69
|
+
|
|
70
|
+
Example:
|
|
71
|
+
>>> req = ResourceRequirements(
|
|
72
|
+
... min_tokens=1000,
|
|
73
|
+
... max_tokens=10000,
|
|
74
|
+
... timeout_seconds=300,
|
|
75
|
+
... memory_mb=512
|
|
76
|
+
... )
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
min_tokens: int = 1000
|
|
80
|
+
max_tokens: int = 10000
|
|
81
|
+
timeout_seconds: int = 300
|
|
82
|
+
memory_mb: int = 512
|
|
83
|
+
|
|
84
|
+
def __post_init__(self):
|
|
85
|
+
"""Validate resource requirements."""
|
|
86
|
+
if self.min_tokens < 0:
|
|
87
|
+
raise ValueError("min_tokens must be non-negative")
|
|
88
|
+
if self.max_tokens < self.min_tokens:
|
|
89
|
+
raise ValueError("max_tokens must be >= min_tokens")
|
|
90
|
+
if self.timeout_seconds <= 0:
|
|
91
|
+
raise ValueError("timeout_seconds must be positive")
|
|
92
|
+
if self.memory_mb <= 0:
|
|
93
|
+
raise ValueError("memory_mb must be positive")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@dataclass(frozen=True)
|
|
97
|
+
class AgentTemplate:
|
|
98
|
+
"""Reusable agent archetype.
|
|
99
|
+
|
|
100
|
+
Templates define agent capabilities, tools, and quality gates.
|
|
101
|
+
They can be customized for specific tasks during agent spawning.
|
|
102
|
+
|
|
103
|
+
Attributes:
|
|
104
|
+
id: Unique template identifier
|
|
105
|
+
role: Agent role description
|
|
106
|
+
capabilities: List of capability names
|
|
107
|
+
tier_preference: Preferred tier ("CHEAP", "CAPABLE", "PREMIUM")
|
|
108
|
+
tools: List of tool identifiers
|
|
109
|
+
default_instructions: Default instructions for the agent
|
|
110
|
+
quality_gates: Quality gate thresholds
|
|
111
|
+
resource_requirements: Resource limits and requirements
|
|
112
|
+
|
|
113
|
+
Example:
|
|
114
|
+
>>> template = AgentTemplate(
|
|
115
|
+
... id="test_coverage_analyzer",
|
|
116
|
+
... role="Test Coverage Expert",
|
|
117
|
+
... capabilities=["analyze_gaps", "suggest_tests"],
|
|
118
|
+
... tier_preference="CAPABLE",
|
|
119
|
+
... tools=["coverage_analyzer"],
|
|
120
|
+
... default_instructions="Analyze test coverage...",
|
|
121
|
+
... quality_gates={"min_coverage": 80}
|
|
122
|
+
... )
|
|
123
|
+
|
|
124
|
+
Security:
|
|
125
|
+
- All fields validated on creation
|
|
126
|
+
- tier_preference restricted to allowed values
|
|
127
|
+
- No user input used in eval/exec
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
id: str
|
|
131
|
+
role: str
|
|
132
|
+
capabilities: list[str]
|
|
133
|
+
tier_preference: str
|
|
134
|
+
tools: list[str]
|
|
135
|
+
default_instructions: str
|
|
136
|
+
quality_gates: dict[str, Any]
|
|
137
|
+
resource_requirements: ResourceRequirements = field(default_factory=ResourceRequirements)
|
|
138
|
+
|
|
139
|
+
ALLOWED_TIERS = {"CHEAP", "CAPABLE", "PREMIUM"}
|
|
140
|
+
|
|
141
|
+
def __post_init__(self):
|
|
142
|
+
"""Validate template fields.
|
|
143
|
+
|
|
144
|
+
Raises:
|
|
145
|
+
ValueError: If any field is invalid
|
|
146
|
+
"""
|
|
147
|
+
# Validate ID
|
|
148
|
+
if not self.id or not isinstance(self.id, str):
|
|
149
|
+
raise ValueError("id must be a non-empty string")
|
|
150
|
+
|
|
151
|
+
# Validate role
|
|
152
|
+
if not self.role or not isinstance(self.role, str):
|
|
153
|
+
raise ValueError("role must be a non-empty string")
|
|
154
|
+
|
|
155
|
+
# Validate capabilities
|
|
156
|
+
if not isinstance(self.capabilities, list):
|
|
157
|
+
raise ValueError("capabilities must be a list")
|
|
158
|
+
if not self.capabilities:
|
|
159
|
+
raise ValueError("capabilities must not be empty")
|
|
160
|
+
for cap in self.capabilities:
|
|
161
|
+
if not isinstance(cap, str) or not cap:
|
|
162
|
+
raise ValueError("all capabilities must be non-empty strings")
|
|
163
|
+
|
|
164
|
+
# Validate tier preference
|
|
165
|
+
if self.tier_preference not in self.ALLOWED_TIERS:
|
|
166
|
+
raise ValueError(f"tier_preference must be one of {self.ALLOWED_TIERS}")
|
|
167
|
+
|
|
168
|
+
# Validate tools
|
|
169
|
+
if not isinstance(self.tools, list):
|
|
170
|
+
raise ValueError("tools must be a list")
|
|
171
|
+
for tool in self.tools:
|
|
172
|
+
if not isinstance(tool, str) or not tool:
|
|
173
|
+
raise ValueError("all tools must be non-empty strings")
|
|
174
|
+
|
|
175
|
+
# Validate instructions
|
|
176
|
+
if not self.default_instructions or not isinstance(self.default_instructions, str):
|
|
177
|
+
raise ValueError("default_instructions must be a non-empty string")
|
|
178
|
+
|
|
179
|
+
# Validate quality gates
|
|
180
|
+
if not isinstance(self.quality_gates, dict):
|
|
181
|
+
raise ValueError("quality_gates must be a dict")
|
|
182
|
+
|
|
183
|
+
# Validate resource requirements
|
|
184
|
+
if not isinstance(self.resource_requirements, ResourceRequirements):
|
|
185
|
+
raise ValueError("resource_requirements must be a ResourceRequirements instance")
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
# Registry of pre-built agent templates
|
|
189
|
+
_TEMPLATE_REGISTRY: dict[str, AgentTemplate] = {}
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def _register_template(template: AgentTemplate) -> None:
|
|
193
|
+
"""Register a template in the global registry.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
template: Template to register
|
|
197
|
+
|
|
198
|
+
Raises:
|
|
199
|
+
ValueError: If template with same ID already registered
|
|
200
|
+
"""
|
|
201
|
+
if template.id in _TEMPLATE_REGISTRY:
|
|
202
|
+
raise ValueError(f"Template '{template.id}' already registered")
|
|
203
|
+
_TEMPLATE_REGISTRY[template.id] = template
|
|
204
|
+
logger.debug(f"Registered template: {template.id}")
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def get_template(template_id: str) -> AgentTemplate | None:
|
|
208
|
+
"""Retrieve template by ID.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
template_id: Template identifier
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
Template if found, None otherwise
|
|
215
|
+
|
|
216
|
+
Example:
|
|
217
|
+
>>> template = get_template("test_coverage_analyzer")
|
|
218
|
+
>>> print(template.role)
|
|
219
|
+
Test Coverage Expert
|
|
220
|
+
"""
|
|
221
|
+
if not template_id or not isinstance(template_id, str):
|
|
222
|
+
logger.warning(f"Invalid template_id: {template_id}")
|
|
223
|
+
return None
|
|
224
|
+
return _TEMPLATE_REGISTRY.get(template_id)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def get_all_templates() -> list[AgentTemplate]:
|
|
228
|
+
"""Retrieve all registered templates.
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
List of all templates
|
|
232
|
+
|
|
233
|
+
Example:
|
|
234
|
+
>>> templates = get_all_templates()
|
|
235
|
+
>>> len(templates) >= 13
|
|
236
|
+
True
|
|
237
|
+
"""
|
|
238
|
+
return list(_TEMPLATE_REGISTRY.values())
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def get_templates_by_capability(capability: str) -> list[AgentTemplate]:
|
|
242
|
+
"""Retrieve templates with a specific capability.
|
|
243
|
+
|
|
244
|
+
Args:
|
|
245
|
+
capability: Capability name to search for
|
|
246
|
+
|
|
247
|
+
Returns:
|
|
248
|
+
List of templates with that capability
|
|
249
|
+
|
|
250
|
+
Example:
|
|
251
|
+
>>> templates = get_templates_by_capability("analyze_gaps")
|
|
252
|
+
>>> any(t.id == "test_coverage_analyzer" for t in templates)
|
|
253
|
+
True
|
|
254
|
+
"""
|
|
255
|
+
if not capability or not isinstance(capability, str):
|
|
256
|
+
logger.warning(f"Invalid capability: {capability}")
|
|
257
|
+
return []
|
|
258
|
+
|
|
259
|
+
return [
|
|
260
|
+
template for template in _TEMPLATE_REGISTRY.values() if capability in template.capabilities
|
|
261
|
+
]
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def get_templates_by_tier(tier: str) -> list[AgentTemplate]:
|
|
265
|
+
"""Retrieve templates preferring a specific tier.
|
|
266
|
+
|
|
267
|
+
Args:
|
|
268
|
+
tier: Tier name ("CHEAP", "CAPABLE", "PREMIUM")
|
|
269
|
+
|
|
270
|
+
Returns:
|
|
271
|
+
List of templates preferring that tier
|
|
272
|
+
|
|
273
|
+
Example:
|
|
274
|
+
>>> templates = get_templates_by_tier("CAPABLE")
|
|
275
|
+
>>> len(templates) > 0
|
|
276
|
+
True
|
|
277
|
+
"""
|
|
278
|
+
if tier not in AgentTemplate.ALLOWED_TIERS:
|
|
279
|
+
logger.warning(f"Invalid tier: {tier}")
|
|
280
|
+
return []
|
|
281
|
+
|
|
282
|
+
return [
|
|
283
|
+
template for template in _TEMPLATE_REGISTRY.values() if template.tier_preference == tier
|
|
284
|
+
]
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
# Pre-built agent templates
|
|
288
|
+
|
|
289
|
+
# Template 1: Test Coverage Analyzer
|
|
290
|
+
_TEST_COVERAGE_ANALYZER = AgentTemplate(
|
|
291
|
+
id="test_coverage_analyzer",
|
|
292
|
+
role="Test Coverage Expert",
|
|
293
|
+
capabilities=["analyze_gaps", "suggest_tests", "validate_coverage"],
|
|
294
|
+
tier_preference="CAPABLE",
|
|
295
|
+
tools=["coverage_analyzer", "ast_parser"],
|
|
296
|
+
default_instructions=(
|
|
297
|
+
"You are a test coverage expert. Analyze the codebase to:\n"
|
|
298
|
+
"1. Identify test coverage gaps\n"
|
|
299
|
+
"2. Suggest specific tests to improve coverage\n"
|
|
300
|
+
"3. Validate that coverage meets quality gates\n"
|
|
301
|
+
"Focus on high-value test cases that improve code quality."
|
|
302
|
+
),
|
|
303
|
+
quality_gates={"min_coverage": 80, "min_quality_score": 7},
|
|
304
|
+
resource_requirements=ResourceRequirements(
|
|
305
|
+
min_tokens=2000,
|
|
306
|
+
max_tokens=15000,
|
|
307
|
+
timeout_seconds=600,
|
|
308
|
+
memory_mb=1024,
|
|
309
|
+
),
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
# Template 2: Security Auditor
|
|
313
|
+
_SECURITY_AUDITOR = AgentTemplate(
|
|
314
|
+
id="security_auditor",
|
|
315
|
+
role="Security Auditor",
|
|
316
|
+
capabilities=[
|
|
317
|
+
"vulnerability_scan",
|
|
318
|
+
"threat_modeling",
|
|
319
|
+
"compliance_check",
|
|
320
|
+
],
|
|
321
|
+
tier_preference="PREMIUM",
|
|
322
|
+
tools=["security_scanner", "bandit", "dependency_checker"],
|
|
323
|
+
default_instructions=(
|
|
324
|
+
"You are a security auditor. Perform comprehensive security analysis:\n"
|
|
325
|
+
"1. Scan for common vulnerabilities (OWASP Top 10)\n"
|
|
326
|
+
"2. Perform threat modeling for critical components\n"
|
|
327
|
+
"3. Verify compliance with security standards\n"
|
|
328
|
+
"4. Generate remediation plan for findings\n"
|
|
329
|
+
"Prioritize critical and high-severity issues."
|
|
330
|
+
),
|
|
331
|
+
quality_gates={
|
|
332
|
+
"max_critical_issues": 0,
|
|
333
|
+
"max_high_issues": 0,
|
|
334
|
+
"min_compliance_score": 90,
|
|
335
|
+
},
|
|
336
|
+
resource_requirements=ResourceRequirements(
|
|
337
|
+
min_tokens=5000,
|
|
338
|
+
max_tokens=30000,
|
|
339
|
+
timeout_seconds=900,
|
|
340
|
+
memory_mb=2048,
|
|
341
|
+
),
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
# Template 3: Code Reviewer
|
|
345
|
+
_CODE_REVIEWER = AgentTemplate(
|
|
346
|
+
id="code_reviewer",
|
|
347
|
+
role="Code Quality Reviewer",
|
|
348
|
+
capabilities=[
|
|
349
|
+
"code_review",
|
|
350
|
+
"quality_assessment",
|
|
351
|
+
"best_practices_check",
|
|
352
|
+
],
|
|
353
|
+
tier_preference="CAPABLE",
|
|
354
|
+
tools=["ast_parser", "complexity_analyzer", "style_checker"],
|
|
355
|
+
default_instructions=(
|
|
356
|
+
"You are a code quality reviewer. Review code for:\n"
|
|
357
|
+
"1. Code quality and maintainability\n"
|
|
358
|
+
"2. Adherence to best practices\n"
|
|
359
|
+
"3. Potential bugs and edge cases\n"
|
|
360
|
+
"4. Performance considerations\n"
|
|
361
|
+
"Provide actionable feedback with specific examples."
|
|
362
|
+
),
|
|
363
|
+
quality_gates={
|
|
364
|
+
"min_quality_score": 7,
|
|
365
|
+
"max_complexity": 15,
|
|
366
|
+
"min_test_coverage": 80,
|
|
367
|
+
},
|
|
368
|
+
resource_requirements=ResourceRequirements(
|
|
369
|
+
min_tokens=3000,
|
|
370
|
+
max_tokens=20000,
|
|
371
|
+
timeout_seconds=600,
|
|
372
|
+
memory_mb=1024,
|
|
373
|
+
),
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
# Template 4: Documentation Writer
|
|
377
|
+
_DOCUMENTATION_WRITER = AgentTemplate(
|
|
378
|
+
id="documentation_writer",
|
|
379
|
+
role="Documentation Writer",
|
|
380
|
+
capabilities=[
|
|
381
|
+
"generate_docs",
|
|
382
|
+
"check_completeness",
|
|
383
|
+
"update_examples",
|
|
384
|
+
],
|
|
385
|
+
tier_preference="CHEAP",
|
|
386
|
+
tools=["ast_parser", "doc_generator"],
|
|
387
|
+
default_instructions=(
|
|
388
|
+
"You are a documentation writer. Create clear, comprehensive docs:\n"
|
|
389
|
+
"1. Generate API documentation from code\n"
|
|
390
|
+
"2. Write usage examples and tutorials\n"
|
|
391
|
+
"3. Update existing documentation for consistency\n"
|
|
392
|
+
"4. Verify all public APIs are documented\n"
|
|
393
|
+
"Focus on clarity and usefulness for developers."
|
|
394
|
+
),
|
|
395
|
+
quality_gates={
|
|
396
|
+
"min_doc_coverage": 100,
|
|
397
|
+
"min_example_count": 3,
|
|
398
|
+
},
|
|
399
|
+
resource_requirements=ResourceRequirements(
|
|
400
|
+
min_tokens=1000,
|
|
401
|
+
max_tokens=10000,
|
|
402
|
+
timeout_seconds=300,
|
|
403
|
+
memory_mb=512,
|
|
404
|
+
),
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
# Template 5: Performance Optimizer
|
|
408
|
+
_PERFORMANCE_OPTIMIZER = AgentTemplate(
|
|
409
|
+
id="performance_optimizer",
|
|
410
|
+
role="Performance Optimizer",
|
|
411
|
+
capabilities=[
|
|
412
|
+
"profile_code",
|
|
413
|
+
"identify_bottlenecks",
|
|
414
|
+
"suggest_optimizations",
|
|
415
|
+
],
|
|
416
|
+
tier_preference="CAPABLE",
|
|
417
|
+
tools=["profiler", "complexity_analyzer", "benchmark_runner"],
|
|
418
|
+
default_instructions=(
|
|
419
|
+
"You are a performance optimizer. Analyze and improve performance:\n"
|
|
420
|
+
"1. Profile code to identify bottlenecks\n"
|
|
421
|
+
"2. Analyze time and space complexity\n"
|
|
422
|
+
"3. Suggest specific optimizations\n"
|
|
423
|
+
"4. Validate improvements with benchmarks\n"
|
|
424
|
+
"Focus on high-impact optimizations with measurable results."
|
|
425
|
+
),
|
|
426
|
+
quality_gates={
|
|
427
|
+
"min_performance_improvement": 20,
|
|
428
|
+
"max_regression_percent": 5,
|
|
429
|
+
},
|
|
430
|
+
resource_requirements=ResourceRequirements(
|
|
431
|
+
min_tokens=2000,
|
|
432
|
+
max_tokens=15000,
|
|
433
|
+
timeout_seconds=900,
|
|
434
|
+
memory_mb=2048,
|
|
435
|
+
),
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
# Template 6: Architecture Analyst
|
|
439
|
+
_ARCHITECTURE_ANALYST = AgentTemplate(
|
|
440
|
+
id="architecture_analyst",
|
|
441
|
+
role="Architecture Analyst",
|
|
442
|
+
capabilities=[
|
|
443
|
+
"analyze_architecture",
|
|
444
|
+
"identify_patterns",
|
|
445
|
+
"suggest_improvements",
|
|
446
|
+
],
|
|
447
|
+
tier_preference="PREMIUM",
|
|
448
|
+
tools=["dependency_analyzer", "pattern_detector", "metrics_collector"],
|
|
449
|
+
default_instructions=(
|
|
450
|
+
"You are an architecture analyst. Analyze system architecture:\n"
|
|
451
|
+
"1. Map dependencies and component relationships\n"
|
|
452
|
+
"2. Identify architectural patterns and anti-patterns\n"
|
|
453
|
+
"3. Assess scalability and maintainability\n"
|
|
454
|
+
"4. Suggest architectural improvements\n"
|
|
455
|
+
"Focus on long-term maintainability and system evolution."
|
|
456
|
+
),
|
|
457
|
+
quality_gates={
|
|
458
|
+
"max_circular_dependencies": 0,
|
|
459
|
+
"min_modularity_score": 7,
|
|
460
|
+
},
|
|
461
|
+
resource_requirements=ResourceRequirements(
|
|
462
|
+
min_tokens=5000,
|
|
463
|
+
max_tokens=30000,
|
|
464
|
+
timeout_seconds=900,
|
|
465
|
+
memory_mb=2048,
|
|
466
|
+
),
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
# Template 7: Refactoring Specialist
|
|
470
|
+
_REFACTORING_SPECIALIST = AgentTemplate(
|
|
471
|
+
id="refactoring_specialist",
|
|
472
|
+
role="Refactoring Specialist",
|
|
473
|
+
capabilities=[
|
|
474
|
+
"identify_code_smells",
|
|
475
|
+
"suggest_refactorings",
|
|
476
|
+
"validate_changes",
|
|
477
|
+
],
|
|
478
|
+
tier_preference="CAPABLE",
|
|
479
|
+
tools=[
|
|
480
|
+
"ast_parser",
|
|
481
|
+
"complexity_analyzer",
|
|
482
|
+
"duplication_detector",
|
|
483
|
+
],
|
|
484
|
+
default_instructions=(
|
|
485
|
+
"You are a refactoring specialist. Improve code structure:\n"
|
|
486
|
+
"1. Identify code smells and technical debt\n"
|
|
487
|
+
"2. Suggest specific refactorings\n"
|
|
488
|
+
"3. Ensure behavior preservation\n"
|
|
489
|
+
"4. Validate improvements with tests\n"
|
|
490
|
+
"Focus on improving maintainability without changing behavior."
|
|
491
|
+
),
|
|
492
|
+
quality_gates={
|
|
493
|
+
"max_duplication_percent": 5,
|
|
494
|
+
"max_complexity": 10,
|
|
495
|
+
"min_test_coverage": 90,
|
|
496
|
+
},
|
|
497
|
+
resource_requirements=ResourceRequirements(
|
|
498
|
+
min_tokens=2000,
|
|
499
|
+
max_tokens=15000,
|
|
500
|
+
timeout_seconds=600,
|
|
501
|
+
memory_mb=1024,
|
|
502
|
+
),
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
# Template 8: Test Generator
|
|
507
|
+
_TEST_GENERATOR = AgentTemplate(
|
|
508
|
+
id="test_generator",
|
|
509
|
+
role="Test Generator",
|
|
510
|
+
capabilities=[
|
|
511
|
+
"generate_unit_tests",
|
|
512
|
+
"generate_integration_tests",
|
|
513
|
+
"create_test_fixtures",
|
|
514
|
+
],
|
|
515
|
+
tier_preference="CAPABLE",
|
|
516
|
+
tools=["ast_parser", "pytest", "test_framework"],
|
|
517
|
+
default_instructions=(
|
|
518
|
+
"You are a test generator. Create comprehensive tests:\n"
|
|
519
|
+
"1. Generate unit tests for uncovered code paths\n"
|
|
520
|
+
"2. Create integration tests for component interactions\n"
|
|
521
|
+
"3. Include edge cases and boundary conditions\n"
|
|
522
|
+
"4. Use appropriate assertions and fixtures\n"
|
|
523
|
+
"Focus on high-value tests that catch real bugs."
|
|
524
|
+
),
|
|
525
|
+
quality_gates={
|
|
526
|
+
"min_assertions_per_test": 1,
|
|
527
|
+
"max_test_complexity": 10,
|
|
528
|
+
},
|
|
529
|
+
resource_requirements=ResourceRequirements(
|
|
530
|
+
min_tokens=2000,
|
|
531
|
+
max_tokens=20000,
|
|
532
|
+
timeout_seconds=600,
|
|
533
|
+
memory_mb=1024,
|
|
534
|
+
),
|
|
535
|
+
)
|
|
536
|
+
|
|
537
|
+
# Template 9: Test Validator
|
|
538
|
+
_TEST_VALIDATOR = AgentTemplate(
|
|
539
|
+
id="test_validator",
|
|
540
|
+
role="Test Validator",
|
|
541
|
+
capabilities=[
|
|
542
|
+
"validate_tests",
|
|
543
|
+
"run_tests",
|
|
544
|
+
"verify_coverage",
|
|
545
|
+
],
|
|
546
|
+
tier_preference="CHEAP",
|
|
547
|
+
tools=["pytest", "coverage_analyzer"],
|
|
548
|
+
default_instructions=(
|
|
549
|
+
"You are a test validator. Verify test quality:\n"
|
|
550
|
+
"1. Run generated tests to verify they pass\n"
|
|
551
|
+
"2. Check that tests actually test the intended behavior\n"
|
|
552
|
+
"3. Verify coverage improvements\n"
|
|
553
|
+
"4. Identify flaky or unreliable tests\n"
|
|
554
|
+
"Focus on ensuring test reliability and correctness."
|
|
555
|
+
),
|
|
556
|
+
quality_gates={
|
|
557
|
+
"min_pass_rate": 100,
|
|
558
|
+
"max_flaky_tests": 0,
|
|
559
|
+
},
|
|
560
|
+
resource_requirements=ResourceRequirements(
|
|
561
|
+
min_tokens=1000,
|
|
562
|
+
max_tokens=8000,
|
|
563
|
+
timeout_seconds=300,
|
|
564
|
+
memory_mb=512,
|
|
565
|
+
),
|
|
566
|
+
)
|
|
567
|
+
|
|
568
|
+
# Template 10: Report Generator
|
|
569
|
+
_REPORT_GENERATOR = AgentTemplate(
|
|
570
|
+
id="report_generator",
|
|
571
|
+
role="Report Generator",
|
|
572
|
+
capabilities=[
|
|
573
|
+
"generate_reports",
|
|
574
|
+
"summarize_findings",
|
|
575
|
+
"create_recommendations",
|
|
576
|
+
],
|
|
577
|
+
tier_preference="CHEAP",
|
|
578
|
+
tools=["markdown_writer"],
|
|
579
|
+
default_instructions=(
|
|
580
|
+
"You are a report generator. Create clear, actionable reports:\n"
|
|
581
|
+
"1. Summarize key findings from analysis\n"
|
|
582
|
+
"2. Prioritize issues by severity and impact\n"
|
|
583
|
+
"3. Provide specific recommendations\n"
|
|
584
|
+
"4. Include metrics and progress indicators\n"
|
|
585
|
+
"Focus on clarity and actionability for the reader."
|
|
586
|
+
),
|
|
587
|
+
quality_gates={
|
|
588
|
+
"min_sections": 3,
|
|
589
|
+
"max_report_length": 5000,
|
|
590
|
+
},
|
|
591
|
+
resource_requirements=ResourceRequirements(
|
|
592
|
+
min_tokens=500,
|
|
593
|
+
max_tokens=5000,
|
|
594
|
+
timeout_seconds=180,
|
|
595
|
+
memory_mb=256,
|
|
596
|
+
),
|
|
597
|
+
)
|
|
598
|
+
|
|
599
|
+
# Template 11: Documentation Analyst
|
|
600
|
+
_DOCUMENTATION_ANALYST = AgentTemplate(
|
|
601
|
+
id="documentation_analyst",
|
|
602
|
+
role="Documentation Analyst",
|
|
603
|
+
capabilities=[
|
|
604
|
+
"analyze_docs",
|
|
605
|
+
"find_gaps",
|
|
606
|
+
"check_freshness",
|
|
607
|
+
],
|
|
608
|
+
tier_preference="CAPABLE",
|
|
609
|
+
tools=["ast_parser", "doc_analyzer", "pydocstyle"],
|
|
610
|
+
default_instructions=(
|
|
611
|
+
"You are a documentation analyst. Analyze documentation quality:\n"
|
|
612
|
+
"1. Identify missing docstrings and documentation\n"
|
|
613
|
+
"2. Find outdated documentation that needs updates\n"
|
|
614
|
+
"3. Check documentation completeness for public APIs\n"
|
|
615
|
+
"4. Verify README and guides are current\n"
|
|
616
|
+
"Focus on finding gaps that impact developer experience."
|
|
617
|
+
),
|
|
618
|
+
quality_gates={
|
|
619
|
+
"min_doc_coverage": 80,
|
|
620
|
+
"max_stale_docs": 5,
|
|
621
|
+
},
|
|
622
|
+
resource_requirements=ResourceRequirements(
|
|
623
|
+
min_tokens=1500,
|
|
624
|
+
max_tokens=12000,
|
|
625
|
+
timeout_seconds=450,
|
|
626
|
+
memory_mb=768,
|
|
627
|
+
),
|
|
628
|
+
)
|
|
629
|
+
|
|
630
|
+
# Template 12: Synthesizer
|
|
631
|
+
_SYNTHESIZER = AgentTemplate(
|
|
632
|
+
id="synthesizer",
|
|
633
|
+
role="Information Synthesizer",
|
|
634
|
+
capabilities=[
|
|
635
|
+
"synthesize_findings",
|
|
636
|
+
"create_action_plans",
|
|
637
|
+
"prioritize_work",
|
|
638
|
+
],
|
|
639
|
+
tier_preference="CAPABLE",
|
|
640
|
+
tools=["markdown_writer"],
|
|
641
|
+
default_instructions=(
|
|
642
|
+
"You are an information synthesizer. Combine and prioritize findings:\n"
|
|
643
|
+
"1. Consolidate findings from multiple analyses\n"
|
|
644
|
+
"2. Identify patterns and common themes\n"
|
|
645
|
+
"3. Create prioritized action plans\n"
|
|
646
|
+
"4. Provide clear next steps with owners\n"
|
|
647
|
+
"Focus on actionable synthesis that drives improvements."
|
|
648
|
+
),
|
|
649
|
+
quality_gates={
|
|
650
|
+
"min_action_items": 3,
|
|
651
|
+
"max_priority_levels": 3,
|
|
652
|
+
},
|
|
653
|
+
resource_requirements=ResourceRequirements(
|
|
654
|
+
min_tokens=1500,
|
|
655
|
+
max_tokens=10000,
|
|
656
|
+
timeout_seconds=400,
|
|
657
|
+
memory_mb=512,
|
|
658
|
+
),
|
|
659
|
+
)
|
|
660
|
+
|
|
661
|
+
# Template 13: Generic Agent
|
|
662
|
+
_GENERIC_AGENT = AgentTemplate(
|
|
663
|
+
id="generic_agent",
|
|
664
|
+
role="General Purpose Agent",
|
|
665
|
+
capabilities=[
|
|
666
|
+
"analyze",
|
|
667
|
+
"generate",
|
|
668
|
+
"review",
|
|
669
|
+
],
|
|
670
|
+
tier_preference="CAPABLE",
|
|
671
|
+
tools=["read", "write", "grep"],
|
|
672
|
+
default_instructions=(
|
|
673
|
+
"You are a general purpose agent. Complete the assigned task:\n"
|
|
674
|
+
"1. Understand the task requirements thoroughly\n"
|
|
675
|
+
"2. Gather necessary information and context\n"
|
|
676
|
+
"3. Execute the task systematically\n"
|
|
677
|
+
"4. Verify the results meet success criteria\n"
|
|
678
|
+
"Focus on quality and completeness."
|
|
679
|
+
),
|
|
680
|
+
quality_gates={
|
|
681
|
+
"min_quality_score": 7,
|
|
682
|
+
},
|
|
683
|
+
resource_requirements=ResourceRequirements(
|
|
684
|
+
min_tokens=1000,
|
|
685
|
+
max_tokens=15000,
|
|
686
|
+
timeout_seconds=600,
|
|
687
|
+
memory_mb=1024,
|
|
688
|
+
),
|
|
689
|
+
)
|
|
690
|
+
|
|
691
|
+
# Register all pre-built templates
|
|
692
|
+
_register_template(_TEST_COVERAGE_ANALYZER)
|
|
693
|
+
_register_template(_SECURITY_AUDITOR)
|
|
694
|
+
_register_template(_CODE_REVIEWER)
|
|
695
|
+
_register_template(_DOCUMENTATION_WRITER)
|
|
696
|
+
_register_template(_PERFORMANCE_OPTIMIZER)
|
|
697
|
+
_register_template(_ARCHITECTURE_ANALYST)
|
|
698
|
+
_register_template(_REFACTORING_SPECIALIST)
|
|
699
|
+
_register_template(_TEST_GENERATOR)
|
|
700
|
+
_register_template(_TEST_VALIDATOR)
|
|
701
|
+
_register_template(_REPORT_GENERATOR)
|
|
702
|
+
_register_template(_DOCUMENTATION_ANALYST)
|
|
703
|
+
_register_template(_SYNTHESIZER)
|
|
704
|
+
_register_template(_GENERIC_AGENT)
|
|
705
|
+
|
|
706
|
+
|
|
707
|
+
logger.info(f"Registered {len(_TEMPLATE_REGISTRY)} agent templates")
|