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.
Files changed (457) hide show
  1. attune/__init__.py +358 -0
  2. attune/adaptive/__init__.py +13 -0
  3. attune/adaptive/task_complexity.py +127 -0
  4. attune/agent_monitoring.py +414 -0
  5. attune/cache/__init__.py +117 -0
  6. attune/cache/base.py +166 -0
  7. attune/cache/dependency_manager.py +256 -0
  8. attune/cache/hash_only.py +251 -0
  9. attune/cache/hybrid.py +457 -0
  10. attune/cache/storage.py +285 -0
  11. attune/cache_monitor.py +356 -0
  12. attune/cache_stats.py +298 -0
  13. attune/cli/__init__.py +152 -0
  14. attune/cli/__main__.py +12 -0
  15. attune/cli/commands/__init__.py +1 -0
  16. attune/cli/commands/batch.py +264 -0
  17. attune/cli/commands/cache.py +248 -0
  18. attune/cli/commands/help.py +331 -0
  19. attune/cli/commands/info.py +140 -0
  20. attune/cli/commands/inspect.py +436 -0
  21. attune/cli/commands/inspection.py +57 -0
  22. attune/cli/commands/memory.py +48 -0
  23. attune/cli/commands/metrics.py +92 -0
  24. attune/cli/commands/orchestrate.py +184 -0
  25. attune/cli/commands/patterns.py +207 -0
  26. attune/cli/commands/profiling.py +202 -0
  27. attune/cli/commands/provider.py +98 -0
  28. attune/cli/commands/routing.py +285 -0
  29. attune/cli/commands/setup.py +96 -0
  30. attune/cli/commands/status.py +235 -0
  31. attune/cli/commands/sync.py +166 -0
  32. attune/cli/commands/tier.py +121 -0
  33. attune/cli/commands/utilities.py +114 -0
  34. attune/cli/commands/workflow.py +579 -0
  35. attune/cli/core.py +32 -0
  36. attune/cli/parsers/__init__.py +68 -0
  37. attune/cli/parsers/batch.py +118 -0
  38. attune/cli/parsers/cache.py +65 -0
  39. attune/cli/parsers/help.py +41 -0
  40. attune/cli/parsers/info.py +26 -0
  41. attune/cli/parsers/inspect.py +66 -0
  42. attune/cli/parsers/metrics.py +42 -0
  43. attune/cli/parsers/orchestrate.py +61 -0
  44. attune/cli/parsers/patterns.py +54 -0
  45. attune/cli/parsers/provider.py +40 -0
  46. attune/cli/parsers/routing.py +110 -0
  47. attune/cli/parsers/setup.py +42 -0
  48. attune/cli/parsers/status.py +47 -0
  49. attune/cli/parsers/sync.py +31 -0
  50. attune/cli/parsers/tier.py +33 -0
  51. attune/cli/parsers/workflow.py +77 -0
  52. attune/cli/utils/__init__.py +1 -0
  53. attune/cli/utils/data.py +242 -0
  54. attune/cli/utils/helpers.py +68 -0
  55. attune/cli_legacy.py +3957 -0
  56. attune/cli_minimal.py +1159 -0
  57. attune/cli_router.py +437 -0
  58. attune/cli_unified.py +814 -0
  59. attune/config/__init__.py +66 -0
  60. attune/config/xml_config.py +286 -0
  61. attune/config.py +545 -0
  62. attune/coordination.py +870 -0
  63. attune/core.py +1511 -0
  64. attune/core_modules/__init__.py +15 -0
  65. attune/cost_tracker.py +626 -0
  66. attune/dashboard/__init__.py +41 -0
  67. attune/dashboard/app.py +512 -0
  68. attune/dashboard/simple_server.py +435 -0
  69. attune/dashboard/standalone_server.py +547 -0
  70. attune/discovery.py +306 -0
  71. attune/emergence.py +306 -0
  72. attune/exceptions.py +123 -0
  73. attune/feedback_loops.py +373 -0
  74. attune/hot_reload/README.md +473 -0
  75. attune/hot_reload/__init__.py +62 -0
  76. attune/hot_reload/config.py +83 -0
  77. attune/hot_reload/integration.py +229 -0
  78. attune/hot_reload/reloader.py +298 -0
  79. attune/hot_reload/watcher.py +183 -0
  80. attune/hot_reload/websocket.py +177 -0
  81. attune/levels.py +577 -0
  82. attune/leverage_points.py +441 -0
  83. attune/logging_config.py +261 -0
  84. attune/mcp/__init__.py +10 -0
  85. attune/mcp/server.py +506 -0
  86. attune/memory/__init__.py +237 -0
  87. attune/memory/claude_memory.py +469 -0
  88. attune/memory/config.py +224 -0
  89. attune/memory/control_panel.py +1290 -0
  90. attune/memory/control_panel_support.py +145 -0
  91. attune/memory/cross_session.py +845 -0
  92. attune/memory/edges.py +179 -0
  93. attune/memory/encryption.py +159 -0
  94. attune/memory/file_session.py +770 -0
  95. attune/memory/graph.py +570 -0
  96. attune/memory/long_term.py +913 -0
  97. attune/memory/long_term_types.py +99 -0
  98. attune/memory/mixins/__init__.py +25 -0
  99. attune/memory/mixins/backend_init_mixin.py +249 -0
  100. attune/memory/mixins/capabilities_mixin.py +208 -0
  101. attune/memory/mixins/handoff_mixin.py +208 -0
  102. attune/memory/mixins/lifecycle_mixin.py +49 -0
  103. attune/memory/mixins/long_term_mixin.py +352 -0
  104. attune/memory/mixins/promotion_mixin.py +109 -0
  105. attune/memory/mixins/short_term_mixin.py +182 -0
  106. attune/memory/nodes.py +179 -0
  107. attune/memory/redis_bootstrap.py +540 -0
  108. attune/memory/security/__init__.py +31 -0
  109. attune/memory/security/audit_logger.py +932 -0
  110. attune/memory/security/pii_scrubber.py +640 -0
  111. attune/memory/security/secrets_detector.py +678 -0
  112. attune/memory/short_term.py +2192 -0
  113. attune/memory/simple_storage.py +302 -0
  114. attune/memory/storage/__init__.py +15 -0
  115. attune/memory/storage_backend.py +167 -0
  116. attune/memory/summary_index.py +583 -0
  117. attune/memory/types.py +446 -0
  118. attune/memory/unified.py +182 -0
  119. attune/meta_workflows/__init__.py +74 -0
  120. attune/meta_workflows/agent_creator.py +248 -0
  121. attune/meta_workflows/builtin_templates.py +567 -0
  122. attune/meta_workflows/cli_commands/__init__.py +56 -0
  123. attune/meta_workflows/cli_commands/agent_commands.py +321 -0
  124. attune/meta_workflows/cli_commands/analytics_commands.py +442 -0
  125. attune/meta_workflows/cli_commands/config_commands.py +232 -0
  126. attune/meta_workflows/cli_commands/memory_commands.py +182 -0
  127. attune/meta_workflows/cli_commands/template_commands.py +354 -0
  128. attune/meta_workflows/cli_commands/workflow_commands.py +382 -0
  129. attune/meta_workflows/cli_meta_workflows.py +59 -0
  130. attune/meta_workflows/form_engine.py +292 -0
  131. attune/meta_workflows/intent_detector.py +409 -0
  132. attune/meta_workflows/models.py +569 -0
  133. attune/meta_workflows/pattern_learner.py +738 -0
  134. attune/meta_workflows/plan_generator.py +384 -0
  135. attune/meta_workflows/session_context.py +397 -0
  136. attune/meta_workflows/template_registry.py +229 -0
  137. attune/meta_workflows/workflow.py +984 -0
  138. attune/metrics/__init__.py +12 -0
  139. attune/metrics/collector.py +31 -0
  140. attune/metrics/prompt_metrics.py +194 -0
  141. attune/models/__init__.py +172 -0
  142. attune/models/__main__.py +13 -0
  143. attune/models/adaptive_routing.py +437 -0
  144. attune/models/auth_cli.py +444 -0
  145. attune/models/auth_strategy.py +450 -0
  146. attune/models/cli.py +655 -0
  147. attune/models/empathy_executor.py +354 -0
  148. attune/models/executor.py +257 -0
  149. attune/models/fallback.py +762 -0
  150. attune/models/provider_config.py +282 -0
  151. attune/models/registry.py +472 -0
  152. attune/models/tasks.py +359 -0
  153. attune/models/telemetry/__init__.py +71 -0
  154. attune/models/telemetry/analytics.py +594 -0
  155. attune/models/telemetry/backend.py +196 -0
  156. attune/models/telemetry/data_models.py +431 -0
  157. attune/models/telemetry/storage.py +489 -0
  158. attune/models/token_estimator.py +420 -0
  159. attune/models/validation.py +280 -0
  160. attune/monitoring/__init__.py +52 -0
  161. attune/monitoring/alerts.py +946 -0
  162. attune/monitoring/alerts_cli.py +448 -0
  163. attune/monitoring/multi_backend.py +271 -0
  164. attune/monitoring/otel_backend.py +362 -0
  165. attune/optimization/__init__.py +19 -0
  166. attune/optimization/context_optimizer.py +272 -0
  167. attune/orchestration/__init__.py +67 -0
  168. attune/orchestration/agent_templates.py +707 -0
  169. attune/orchestration/config_store.py +499 -0
  170. attune/orchestration/execution_strategies.py +2111 -0
  171. attune/orchestration/meta_orchestrator.py +1168 -0
  172. attune/orchestration/pattern_learner.py +696 -0
  173. attune/orchestration/real_tools.py +931 -0
  174. attune/pattern_cache.py +187 -0
  175. attune/pattern_library.py +542 -0
  176. attune/patterns/debugging/all_patterns.json +81 -0
  177. attune/patterns/debugging/workflow_20260107_1770825e.json +77 -0
  178. attune/patterns/refactoring_memory.json +89 -0
  179. attune/persistence.py +564 -0
  180. attune/platform_utils.py +265 -0
  181. attune/plugins/__init__.py +28 -0
  182. attune/plugins/base.py +361 -0
  183. attune/plugins/registry.py +268 -0
  184. attune/project_index/__init__.py +32 -0
  185. attune/project_index/cli.py +335 -0
  186. attune/project_index/index.py +667 -0
  187. attune/project_index/models.py +504 -0
  188. attune/project_index/reports.py +474 -0
  189. attune/project_index/scanner.py +777 -0
  190. attune/project_index/scanner_parallel.py +291 -0
  191. attune/prompts/__init__.py +61 -0
  192. attune/prompts/config.py +77 -0
  193. attune/prompts/context.py +177 -0
  194. attune/prompts/parser.py +285 -0
  195. attune/prompts/registry.py +313 -0
  196. attune/prompts/templates.py +208 -0
  197. attune/redis_config.py +302 -0
  198. attune/redis_memory.py +799 -0
  199. attune/resilience/__init__.py +56 -0
  200. attune/resilience/circuit_breaker.py +256 -0
  201. attune/resilience/fallback.py +179 -0
  202. attune/resilience/health.py +300 -0
  203. attune/resilience/retry.py +209 -0
  204. attune/resilience/timeout.py +135 -0
  205. attune/routing/__init__.py +43 -0
  206. attune/routing/chain_executor.py +433 -0
  207. attune/routing/classifier.py +217 -0
  208. attune/routing/smart_router.py +234 -0
  209. attune/routing/workflow_registry.py +343 -0
  210. attune/scaffolding/README.md +589 -0
  211. attune/scaffolding/__init__.py +35 -0
  212. attune/scaffolding/__main__.py +14 -0
  213. attune/scaffolding/cli.py +240 -0
  214. attune/scaffolding/templates/base_wizard.py.jinja2 +121 -0
  215. attune/scaffolding/templates/coach_wizard.py.jinja2 +321 -0
  216. attune/scaffolding/templates/domain_wizard.py.jinja2 +408 -0
  217. attune/scaffolding/templates/linear_flow_wizard.py.jinja2 +203 -0
  218. attune/socratic/__init__.py +256 -0
  219. attune/socratic/ab_testing.py +958 -0
  220. attune/socratic/blueprint.py +533 -0
  221. attune/socratic/cli.py +703 -0
  222. attune/socratic/collaboration.py +1114 -0
  223. attune/socratic/domain_templates.py +924 -0
  224. attune/socratic/embeddings.py +738 -0
  225. attune/socratic/engine.py +794 -0
  226. attune/socratic/explainer.py +682 -0
  227. attune/socratic/feedback.py +772 -0
  228. attune/socratic/forms.py +629 -0
  229. attune/socratic/generator.py +732 -0
  230. attune/socratic/llm_analyzer.py +637 -0
  231. attune/socratic/mcp_server.py +702 -0
  232. attune/socratic/session.py +312 -0
  233. attune/socratic/storage.py +667 -0
  234. attune/socratic/success.py +730 -0
  235. attune/socratic/visual_editor.py +860 -0
  236. attune/socratic/web_ui.py +958 -0
  237. attune/telemetry/__init__.py +39 -0
  238. attune/telemetry/agent_coordination.py +475 -0
  239. attune/telemetry/agent_tracking.py +367 -0
  240. attune/telemetry/approval_gates.py +545 -0
  241. attune/telemetry/cli.py +1231 -0
  242. attune/telemetry/commands/__init__.py +14 -0
  243. attune/telemetry/commands/dashboard_commands.py +696 -0
  244. attune/telemetry/event_streaming.py +409 -0
  245. attune/telemetry/feedback_loop.py +567 -0
  246. attune/telemetry/usage_tracker.py +591 -0
  247. attune/templates.py +754 -0
  248. attune/test_generator/__init__.py +38 -0
  249. attune/test_generator/__main__.py +14 -0
  250. attune/test_generator/cli.py +234 -0
  251. attune/test_generator/generator.py +355 -0
  252. attune/test_generator/risk_analyzer.py +216 -0
  253. attune/test_generator/templates/unit_test.py.jinja2 +272 -0
  254. attune/tier_recommender.py +384 -0
  255. attune/tools.py +183 -0
  256. attune/trust/__init__.py +28 -0
  257. attune/trust/circuit_breaker.py +579 -0
  258. attune/trust_building.py +527 -0
  259. attune/validation/__init__.py +19 -0
  260. attune/validation/xml_validator.py +281 -0
  261. attune/vscode_bridge.py +173 -0
  262. attune/workflow_commands.py +780 -0
  263. attune/workflow_patterns/__init__.py +33 -0
  264. attune/workflow_patterns/behavior.py +249 -0
  265. attune/workflow_patterns/core.py +76 -0
  266. attune/workflow_patterns/output.py +99 -0
  267. attune/workflow_patterns/registry.py +255 -0
  268. attune/workflow_patterns/structural.py +288 -0
  269. attune/workflows/__init__.py +539 -0
  270. attune/workflows/autonomous_test_gen.py +1268 -0
  271. attune/workflows/base.py +2667 -0
  272. attune/workflows/batch_processing.py +342 -0
  273. attune/workflows/bug_predict.py +1084 -0
  274. attune/workflows/builder.py +273 -0
  275. attune/workflows/caching.py +253 -0
  276. attune/workflows/code_review.py +1048 -0
  277. attune/workflows/code_review_adapters.py +312 -0
  278. attune/workflows/code_review_pipeline.py +722 -0
  279. attune/workflows/config.py +645 -0
  280. attune/workflows/dependency_check.py +644 -0
  281. attune/workflows/document_gen/__init__.py +25 -0
  282. attune/workflows/document_gen/config.py +30 -0
  283. attune/workflows/document_gen/report_formatter.py +162 -0
  284. attune/workflows/document_gen/workflow.py +1426 -0
  285. attune/workflows/document_manager.py +216 -0
  286. attune/workflows/document_manager_README.md +134 -0
  287. attune/workflows/documentation_orchestrator.py +1205 -0
  288. attune/workflows/history.py +510 -0
  289. attune/workflows/keyboard_shortcuts/__init__.py +39 -0
  290. attune/workflows/keyboard_shortcuts/generators.py +391 -0
  291. attune/workflows/keyboard_shortcuts/parsers.py +416 -0
  292. attune/workflows/keyboard_shortcuts/prompts.py +295 -0
  293. attune/workflows/keyboard_shortcuts/schema.py +193 -0
  294. attune/workflows/keyboard_shortcuts/workflow.py +509 -0
  295. attune/workflows/llm_base.py +363 -0
  296. attune/workflows/manage_docs.py +87 -0
  297. attune/workflows/manage_docs_README.md +134 -0
  298. attune/workflows/manage_documentation.py +821 -0
  299. attune/workflows/new_sample_workflow1.py +149 -0
  300. attune/workflows/new_sample_workflow1_README.md +150 -0
  301. attune/workflows/orchestrated_health_check.py +849 -0
  302. attune/workflows/orchestrated_release_prep.py +600 -0
  303. attune/workflows/output.py +413 -0
  304. attune/workflows/perf_audit.py +863 -0
  305. attune/workflows/pr_review.py +762 -0
  306. attune/workflows/progress.py +785 -0
  307. attune/workflows/progress_server.py +322 -0
  308. attune/workflows/progressive/README 2.md +454 -0
  309. attune/workflows/progressive/README.md +454 -0
  310. attune/workflows/progressive/__init__.py +82 -0
  311. attune/workflows/progressive/cli.py +219 -0
  312. attune/workflows/progressive/core.py +488 -0
  313. attune/workflows/progressive/orchestrator.py +723 -0
  314. attune/workflows/progressive/reports.py +520 -0
  315. attune/workflows/progressive/telemetry.py +274 -0
  316. attune/workflows/progressive/test_gen.py +495 -0
  317. attune/workflows/progressive/workflow.py +589 -0
  318. attune/workflows/refactor_plan.py +694 -0
  319. attune/workflows/release_prep.py +895 -0
  320. attune/workflows/release_prep_crew.py +969 -0
  321. attune/workflows/research_synthesis.py +404 -0
  322. attune/workflows/routing.py +168 -0
  323. attune/workflows/secure_release.py +593 -0
  324. attune/workflows/security_adapters.py +297 -0
  325. attune/workflows/security_audit.py +1329 -0
  326. attune/workflows/security_audit_phase3.py +355 -0
  327. attune/workflows/seo_optimization.py +633 -0
  328. attune/workflows/step_config.py +234 -0
  329. attune/workflows/telemetry_mixin.py +269 -0
  330. attune/workflows/test5.py +125 -0
  331. attune/workflows/test5_README.md +158 -0
  332. attune/workflows/test_coverage_boost_crew.py +849 -0
  333. attune/workflows/test_gen/__init__.py +52 -0
  334. attune/workflows/test_gen/ast_analyzer.py +249 -0
  335. attune/workflows/test_gen/config.py +88 -0
  336. attune/workflows/test_gen/data_models.py +38 -0
  337. attune/workflows/test_gen/report_formatter.py +289 -0
  338. attune/workflows/test_gen/test_templates.py +381 -0
  339. attune/workflows/test_gen/workflow.py +655 -0
  340. attune/workflows/test_gen.py +54 -0
  341. attune/workflows/test_gen_behavioral.py +477 -0
  342. attune/workflows/test_gen_parallel.py +341 -0
  343. attune/workflows/test_lifecycle.py +526 -0
  344. attune/workflows/test_maintenance.py +627 -0
  345. attune/workflows/test_maintenance_cli.py +590 -0
  346. attune/workflows/test_maintenance_crew.py +840 -0
  347. attune/workflows/test_runner.py +622 -0
  348. attune/workflows/tier_tracking.py +531 -0
  349. attune/workflows/xml_enhanced_crew.py +285 -0
  350. attune_ai-2.0.0.dist-info/METADATA +1026 -0
  351. attune_ai-2.0.0.dist-info/RECORD +457 -0
  352. attune_ai-2.0.0.dist-info/WHEEL +5 -0
  353. attune_ai-2.0.0.dist-info/entry_points.txt +26 -0
  354. attune_ai-2.0.0.dist-info/licenses/LICENSE +201 -0
  355. attune_ai-2.0.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +101 -0
  356. attune_ai-2.0.0.dist-info/top_level.txt +5 -0
  357. attune_healthcare/__init__.py +13 -0
  358. attune_healthcare/monitors/__init__.py +9 -0
  359. attune_healthcare/monitors/clinical_protocol_monitor.py +315 -0
  360. attune_healthcare/monitors/monitoring/__init__.py +44 -0
  361. attune_healthcare/monitors/monitoring/protocol_checker.py +300 -0
  362. attune_healthcare/monitors/monitoring/protocol_loader.py +214 -0
  363. attune_healthcare/monitors/monitoring/sensor_parsers.py +306 -0
  364. attune_healthcare/monitors/monitoring/trajectory_analyzer.py +389 -0
  365. attune_llm/README.md +553 -0
  366. attune_llm/__init__.py +28 -0
  367. attune_llm/agent_factory/__init__.py +53 -0
  368. attune_llm/agent_factory/adapters/__init__.py +85 -0
  369. attune_llm/agent_factory/adapters/autogen_adapter.py +312 -0
  370. attune_llm/agent_factory/adapters/crewai_adapter.py +483 -0
  371. attune_llm/agent_factory/adapters/haystack_adapter.py +298 -0
  372. attune_llm/agent_factory/adapters/langchain_adapter.py +362 -0
  373. attune_llm/agent_factory/adapters/langgraph_adapter.py +333 -0
  374. attune_llm/agent_factory/adapters/native.py +228 -0
  375. attune_llm/agent_factory/adapters/wizard_adapter.py +423 -0
  376. attune_llm/agent_factory/base.py +305 -0
  377. attune_llm/agent_factory/crews/__init__.py +67 -0
  378. attune_llm/agent_factory/crews/code_review.py +1113 -0
  379. attune_llm/agent_factory/crews/health_check.py +1262 -0
  380. attune_llm/agent_factory/crews/refactoring.py +1128 -0
  381. attune_llm/agent_factory/crews/security_audit.py +1018 -0
  382. attune_llm/agent_factory/decorators.py +287 -0
  383. attune_llm/agent_factory/factory.py +558 -0
  384. attune_llm/agent_factory/framework.py +193 -0
  385. attune_llm/agent_factory/memory_integration.py +328 -0
  386. attune_llm/agent_factory/resilient.py +320 -0
  387. attune_llm/agents_md/__init__.py +22 -0
  388. attune_llm/agents_md/loader.py +218 -0
  389. attune_llm/agents_md/parser.py +271 -0
  390. attune_llm/agents_md/registry.py +307 -0
  391. attune_llm/claude_memory.py +466 -0
  392. attune_llm/cli/__init__.py +8 -0
  393. attune_llm/cli/sync_claude.py +487 -0
  394. attune_llm/code_health.py +1313 -0
  395. attune_llm/commands/__init__.py +51 -0
  396. attune_llm/commands/context.py +375 -0
  397. attune_llm/commands/loader.py +301 -0
  398. attune_llm/commands/models.py +231 -0
  399. attune_llm/commands/parser.py +371 -0
  400. attune_llm/commands/registry.py +429 -0
  401. attune_llm/config/__init__.py +29 -0
  402. attune_llm/config/unified.py +291 -0
  403. attune_llm/context/__init__.py +22 -0
  404. attune_llm/context/compaction.py +455 -0
  405. attune_llm/context/manager.py +434 -0
  406. attune_llm/contextual_patterns.py +361 -0
  407. attune_llm/core.py +907 -0
  408. attune_llm/git_pattern_extractor.py +435 -0
  409. attune_llm/hooks/__init__.py +24 -0
  410. attune_llm/hooks/config.py +306 -0
  411. attune_llm/hooks/executor.py +289 -0
  412. attune_llm/hooks/registry.py +302 -0
  413. attune_llm/hooks/scripts/__init__.py +39 -0
  414. attune_llm/hooks/scripts/evaluate_session.py +201 -0
  415. attune_llm/hooks/scripts/first_time_init.py +285 -0
  416. attune_llm/hooks/scripts/pre_compact.py +207 -0
  417. attune_llm/hooks/scripts/session_end.py +183 -0
  418. attune_llm/hooks/scripts/session_start.py +163 -0
  419. attune_llm/hooks/scripts/suggest_compact.py +225 -0
  420. attune_llm/learning/__init__.py +30 -0
  421. attune_llm/learning/evaluator.py +438 -0
  422. attune_llm/learning/extractor.py +514 -0
  423. attune_llm/learning/storage.py +560 -0
  424. attune_llm/levels.py +227 -0
  425. attune_llm/pattern_confidence.py +414 -0
  426. attune_llm/pattern_resolver.py +272 -0
  427. attune_llm/pattern_summary.py +350 -0
  428. attune_llm/providers.py +967 -0
  429. attune_llm/routing/__init__.py +32 -0
  430. attune_llm/routing/model_router.py +362 -0
  431. attune_llm/security/IMPLEMENTATION_SUMMARY.md +413 -0
  432. attune_llm/security/PHASE2_COMPLETE.md +384 -0
  433. attune_llm/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  434. attune_llm/security/QUICK_REFERENCE.md +316 -0
  435. attune_llm/security/README.md +262 -0
  436. attune_llm/security/__init__.py +62 -0
  437. attune_llm/security/audit_logger.py +929 -0
  438. attune_llm/security/audit_logger_example.py +152 -0
  439. attune_llm/security/pii_scrubber.py +640 -0
  440. attune_llm/security/secrets_detector.py +678 -0
  441. attune_llm/security/secrets_detector_example.py +304 -0
  442. attune_llm/security/secure_memdocs.py +1192 -0
  443. attune_llm/security/secure_memdocs_example.py +278 -0
  444. attune_llm/session_status.py +745 -0
  445. attune_llm/state.py +246 -0
  446. attune_llm/utils/__init__.py +5 -0
  447. attune_llm/utils/tokens.py +349 -0
  448. attune_software/SOFTWARE_PLUGIN_README.md +57 -0
  449. attune_software/__init__.py +13 -0
  450. attune_software/cli/__init__.py +120 -0
  451. attune_software/cli/inspect.py +362 -0
  452. attune_software/cli.py +574 -0
  453. attune_software/plugin.py +188 -0
  454. workflow_scaffolding/__init__.py +11 -0
  455. workflow_scaffolding/__main__.py +12 -0
  456. workflow_scaffolding/cli.py +206 -0
  457. 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")