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
attune/mcp/__init__.py ADDED
@@ -0,0 +1,10 @@
1
+ """Empathy Framework MCP Server.
2
+
3
+ Model Context Protocol integration for Claude Code.
4
+ Exposes Empathy workflows, agents, and telemetry as MCP tools.
5
+ """
6
+
7
+ __version__ = "5.1.1"
8
+ __all__ = ["EmpathyMCPServer", "create_server"]
9
+
10
+ from attune.mcp.server import EmpathyMCPServer, create_server
attune/mcp/server.py ADDED
@@ -0,0 +1,506 @@
1
+ """Empathy Framework MCP Server Implementation.
2
+
3
+ Exposes Empathy workflows as MCP tools for Claude Code integration.
4
+ """
5
+ import asyncio
6
+ import json
7
+ import logging
8
+ import sys
9
+ from typing import Any
10
+
11
+ # MCP server will be implemented using stdio transport
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ class EmpathyMCPServer:
16
+ """MCP server for Empathy Framework workflows.
17
+
18
+ Exposes workflows, agent dashboard, and telemetry as MCP tools
19
+ that can be invoked from Claude Code.
20
+ """
21
+
22
+ def __init__(self):
23
+ """Initialize the MCP server."""
24
+ self.tools = self._register_tools()
25
+ self.resources = self._register_resources()
26
+
27
+ def _register_tools(self) -> dict[str, dict[str, Any]]:
28
+ """Register available MCP tools.
29
+
30
+ Returns:
31
+ Dictionary of tool definitions
32
+ """
33
+ return {
34
+ "security_audit": {
35
+ "name": "security_audit",
36
+ "description": "Run security audit workflow on codebase. Detects vulnerabilities, dangerous patterns, and security issues. Returns findings with severity levels.",
37
+ "input_schema": {
38
+ "type": "object",
39
+ "properties": {
40
+ "path": {
41
+ "type": "string",
42
+ "description": "Path to directory or file to audit"
43
+ }
44
+ },
45
+ "required": ["path"]
46
+ }
47
+ },
48
+ "bug_predict": {
49
+ "name": "bug_predict",
50
+ "description": "Run bug prediction workflow. Analyzes code patterns and predicts potential bugs before they occur.",
51
+ "input_schema": {
52
+ "type": "object",
53
+ "properties": {
54
+ "path": {
55
+ "type": "string",
56
+ "description": "Path to directory or file to analyze"
57
+ }
58
+ },
59
+ "required": ["path"]
60
+ }
61
+ },
62
+ "code_review": {
63
+ "name": "code_review",
64
+ "description": "Run code review workflow. Provides comprehensive code quality analysis with suggestions for improvement.",
65
+ "input_schema": {
66
+ "type": "object",
67
+ "properties": {
68
+ "path": {
69
+ "type": "string",
70
+ "description": "Path to directory or file to review"
71
+ }
72
+ },
73
+ "required": ["path"]
74
+ }
75
+ },
76
+ "test_generation": {
77
+ "name": "test_generation",
78
+ "description": "Generate tests for code. Can batch generate tests for multiple modules in parallel.",
79
+ "input_schema": {
80
+ "type": "object",
81
+ "properties": {
82
+ "module": {
83
+ "type": "string",
84
+ "description": "Path to Python module"
85
+ },
86
+ "batch": {
87
+ "type": "boolean",
88
+ "description": "Enable batch mode for parallel generation",
89
+ "default": False
90
+ }
91
+ },
92
+ "required": ["module"]
93
+ }
94
+ },
95
+ "performance_audit": {
96
+ "name": "performance_audit",
97
+ "description": "Run performance audit workflow. Identifies bottlenecks, memory leaks, and optimization opportunities.",
98
+ "input_schema": {
99
+ "type": "object",
100
+ "properties": {
101
+ "path": {
102
+ "type": "string",
103
+ "description": "Path to directory or file to audit"
104
+ }
105
+ },
106
+ "required": ["path"]
107
+ }
108
+ },
109
+ "release_prep": {
110
+ "name": "release_prep",
111
+ "description": "Run release preparation workflow. Checks health, security, changelog, and provides release recommendation.",
112
+ "input_schema": {
113
+ "type": "object",
114
+ "properties": {
115
+ "path": {
116
+ "type": "string",
117
+ "description": "Path to project root",
118
+ "default": "."
119
+ }
120
+ }
121
+ }
122
+ },
123
+ "auth_status": {
124
+ "name": "auth_status",
125
+ "description": "Get authentication strategy status. Shows current configuration, subscription tier, and default mode.",
126
+ "input_schema": {
127
+ "type": "object",
128
+ "properties": {}
129
+ }
130
+ },
131
+ "auth_recommend": {
132
+ "name": "auth_recommend",
133
+ "description": "Get authentication recommendation for a file. Analyzes LOC and suggests optimal auth mode.",
134
+ "input_schema": {
135
+ "type": "object",
136
+ "properties": {
137
+ "file_path": {
138
+ "type": "string",
139
+ "description": "Path to file to analyze"
140
+ }
141
+ },
142
+ "required": ["file_path"]
143
+ }
144
+ },
145
+ "telemetry_stats": {
146
+ "name": "telemetry_stats",
147
+ "description": "Get telemetry statistics. Shows cost savings, cache hit rates, and workflow performance.",
148
+ "input_schema": {
149
+ "type": "object",
150
+ "properties": {
151
+ "days": {
152
+ "type": "integer",
153
+ "description": "Number of days to analyze",
154
+ "default": 30
155
+ }
156
+ }
157
+ }
158
+ },
159
+ "dashboard_status": {
160
+ "name": "dashboard_status",
161
+ "description": "Get agent coordination dashboard status. Shows active agents, pending approvals, recent signals.",
162
+ "input_schema": {
163
+ "type": "object",
164
+ "properties": {}
165
+ }
166
+ }
167
+ }
168
+
169
+ def _register_resources(self) -> dict[str, dict[str, Any]]:
170
+ """Register available MCP resources.
171
+
172
+ Returns:
173
+ Dictionary of resource definitions
174
+ """
175
+ return {
176
+ "workflows": {
177
+ "uri": "empathy://workflows",
178
+ "name": "Available Workflows",
179
+ "description": "List of all available Empathy workflows",
180
+ "mime_type": "application/json"
181
+ },
182
+ "auth_config": {
183
+ "uri": "empathy://auth/config",
184
+ "name": "Authentication Configuration",
185
+ "description": "Current authentication strategy configuration",
186
+ "mime_type": "application/json"
187
+ },
188
+ "telemetry": {
189
+ "uri": "empathy://telemetry",
190
+ "name": "Telemetry Data",
191
+ "description": "Cost tracking and performance metrics",
192
+ "mime_type": "application/json"
193
+ }
194
+ }
195
+
196
+ async def call_tool(self, tool_name: str, arguments: dict[str, Any]) -> dict[str, Any]:
197
+ """Execute a tool call.
198
+
199
+ Args:
200
+ tool_name: Name of the tool to execute
201
+ arguments: Tool arguments
202
+
203
+ Returns:
204
+ Tool execution result
205
+ """
206
+ try:
207
+ if tool_name == "security_audit":
208
+ return await self._run_security_audit(arguments)
209
+ elif tool_name == "bug_predict":
210
+ return await self._run_bug_predict(arguments)
211
+ elif tool_name == "code_review":
212
+ return await self._run_code_review(arguments)
213
+ elif tool_name == "test_generation":
214
+ return await self._run_test_generation(arguments)
215
+ elif tool_name == "performance_audit":
216
+ return await self._run_performance_audit(arguments)
217
+ elif tool_name == "release_prep":
218
+ return await self._run_release_prep(arguments)
219
+ elif tool_name == "auth_status":
220
+ return await self._get_auth_status()
221
+ elif tool_name == "auth_recommend":
222
+ return await self._get_auth_recommend(arguments)
223
+ elif tool_name == "telemetry_stats":
224
+ return await self._get_telemetry_stats(arguments)
225
+ elif tool_name == "dashboard_status":
226
+ return await self._get_dashboard_status()
227
+ else:
228
+ return {
229
+ "success": False,
230
+ "error": f"Unknown tool: {tool_name}"
231
+ }
232
+ except Exception as e:
233
+ logger.exception(f"Tool execution failed: {tool_name}")
234
+ return {
235
+ "success": False,
236
+ "error": str(e)
237
+ }
238
+
239
+ async def _run_security_audit(self, args: dict[str, Any]) -> dict[str, Any]:
240
+ """Run security audit workflow."""
241
+ from attune.workflows.security_audit import SecurityAuditWorkflow
242
+
243
+ workflow = SecurityAuditWorkflow()
244
+ result = await workflow.execute(path=args["path"])
245
+
246
+ return {
247
+ "success": result.success,
248
+ "score": result.final_output.get("health_score"),
249
+ "findings": result.final_output.get("findings", []),
250
+ "cost": result.cost_report.total_cost,
251
+ "provider": result.provider
252
+ }
253
+
254
+ async def _run_bug_predict(self, args: dict[str, Any]) -> dict[str, Any]:
255
+ """Run bug prediction workflow."""
256
+ from attune.workflows.bug_predict import BugPredictWorkflow
257
+
258
+ workflow = BugPredictWorkflow()
259
+ result = await workflow.execute(path=args["path"])
260
+
261
+ return {
262
+ "success": result.success,
263
+ "predictions": result.final_output.get("predictions", []),
264
+ "cost": result.cost_report.total_cost
265
+ }
266
+
267
+ async def _run_code_review(self, args: dict[str, Any]) -> dict[str, Any]:
268
+ """Run code review workflow."""
269
+ from attune.workflows.code_review import CodeReviewWorkflow
270
+
271
+ workflow = CodeReviewWorkflow()
272
+ result = await workflow.execute(target_path=args["path"])
273
+
274
+ return {
275
+ "success": result.success,
276
+ "feedback": result.final_output.get("feedback"),
277
+ "score": result.final_output.get("quality_score"),
278
+ "cost": result.cost_report.total_cost
279
+ }
280
+
281
+ async def _run_test_generation(self, args: dict[str, Any]) -> dict[str, Any]:
282
+ """Run test generation workflow."""
283
+ from attune.workflows.test_gen import TestGenerationWorkflow
284
+
285
+ workflow = TestGenerationWorkflow()
286
+ result = await workflow.execute(module_path=args["module"])
287
+
288
+ return {
289
+ "success": result.success,
290
+ "tests_generated": result.final_output.get("tests_generated", 0),
291
+ "output_path": result.final_output.get("output_path"),
292
+ "cost": result.cost_report.total_cost
293
+ }
294
+
295
+ async def _run_performance_audit(self, args: dict[str, Any]) -> dict[str, Any]:
296
+ """Run performance audit workflow."""
297
+ from attune.workflows.perf_audit import PerformanceAuditWorkflow
298
+
299
+ workflow = PerformanceAuditWorkflow()
300
+ result = await workflow.execute(path=args["path"])
301
+
302
+ return {
303
+ "success": result.success,
304
+ "findings": result.final_output.get("findings", []),
305
+ "score": result.final_output.get("score"),
306
+ "cost": result.cost_report.total_cost
307
+ }
308
+
309
+ async def _run_release_prep(self, args: dict[str, Any]) -> dict[str, Any]:
310
+ """Run release preparation workflow."""
311
+ from attune.workflows.release_prep import ReleasePreparationWorkflow
312
+
313
+ workflow = ReleasePreparationWorkflow(skip_approve_if_clean=True)
314
+ result = await workflow.execute(path=args.get("path", "."))
315
+
316
+ return {
317
+ "success": result.success,
318
+ "approved": result.final_output.get("approved"),
319
+ "health_score": result.final_output.get("health_score"),
320
+ "recommendation": result.final_output.get("recommendation"),
321
+ "cost": result.cost_report.total_cost
322
+ }
323
+
324
+ async def _get_auth_status(self) -> dict[str, Any]:
325
+ """Get authentication strategy status."""
326
+ from attune.models import AuthStrategy
327
+
328
+ strategy = AuthStrategy.load()
329
+
330
+ return {
331
+ "success": True,
332
+ "subscription_tier": strategy.subscription_tier.value,
333
+ "default_mode": strategy.default_mode.value,
334
+ "setup_completed": strategy.setup_completed
335
+ }
336
+
337
+ async def _get_auth_recommend(self, args: dict[str, Any]) -> dict[str, Any]:
338
+ """Get authentication recommendation."""
339
+ from pathlib import Path
340
+
341
+ from attune.models import (
342
+ count_lines_of_code,
343
+ get_auth_strategy,
344
+ get_module_size_category,
345
+ )
346
+
347
+ file_path = Path(args["file_path"])
348
+ lines = count_lines_of_code(file_path)
349
+ category = get_module_size_category(lines)
350
+
351
+ strategy = get_auth_strategy()
352
+ recommended = strategy.get_recommended_mode(lines)
353
+
354
+ return {
355
+ "success": True,
356
+ "file_path": str(file_path),
357
+ "lines_of_code": lines,
358
+ "category": category,
359
+ "recommended_mode": recommended.value
360
+ }
361
+
362
+ async def _get_telemetry_stats(self, args: dict[str, Any]) -> dict[str, Any]:
363
+ """Get telemetry statistics."""
364
+ # Placeholder - would integrate with actual telemetry system
365
+ return {
366
+ "success": True,
367
+ "days": args.get("days", 30),
368
+ "total_cost": 0.0,
369
+ "savings": 0.0,
370
+ "cache_hit_rate": 0.0
371
+ }
372
+
373
+ async def _get_dashboard_status(self) -> dict[str, Any]:
374
+ """Get dashboard status."""
375
+ # Placeholder - would integrate with actual dashboard
376
+ return {
377
+ "success": True,
378
+ "active_agents": 0,
379
+ "pending_approvals": 0,
380
+ "recent_signals": 0
381
+ }
382
+
383
+ def get_tool_list(self) -> list[dict[str, Any]]:
384
+ """Get list of available tools.
385
+
386
+ Returns:
387
+ List of tool definitions
388
+ """
389
+ return list(self.tools.values())
390
+
391
+ def get_resource_list(self) -> list[dict[str, Any]]:
392
+ """Get list of available resources.
393
+
394
+ Returns:
395
+ List of resource definitions
396
+ """
397
+ return list(self.resources.values())
398
+
399
+
400
+ async def handle_request(server: EmpathyMCPServer, request: dict[str, Any]) -> dict[str, Any]:
401
+ """Handle an MCP request.
402
+
403
+ Args:
404
+ server: MCP server instance
405
+ request: MCP request
406
+
407
+ Returns:
408
+ MCP response
409
+ """
410
+ method = request.get("method")
411
+ params = request.get("params", {})
412
+
413
+ if method == "tools/list":
414
+ return {
415
+ "tools": server.get_tool_list()
416
+ }
417
+ elif method == "tools/call":
418
+ tool_name = params.get("name")
419
+ arguments = params.get("arguments", {})
420
+ result = await server.call_tool(tool_name, arguments)
421
+ return {
422
+ "content": [
423
+ {
424
+ "type": "text",
425
+ "text": json.dumps(result, indent=2)
426
+ }
427
+ ]
428
+ }
429
+ elif method == "resources/list":
430
+ return {
431
+ "resources": server.get_resource_list()
432
+ }
433
+ else:
434
+ return {
435
+ "error": {
436
+ "code": -32601,
437
+ "message": f"Method not found: {method}"
438
+ }
439
+ }
440
+
441
+
442
+ async def main_loop():
443
+ """Main MCP server loop using stdio transport."""
444
+ server = EmpathyMCPServer()
445
+
446
+ logger.info("Empathy MCP Server started")
447
+ logger.info(f"Registered {len(server.tools)} tools")
448
+
449
+ while True:
450
+ try:
451
+ # Read request from stdin (JSON-RPC format)
452
+ line = await asyncio.get_event_loop().run_in_executor(None, sys.stdin.readline)
453
+ if not line:
454
+ break
455
+
456
+ request = json.loads(line)
457
+ response = await handle_request(server, request)
458
+
459
+ # Write response to stdout
460
+ print(json.dumps(response), flush=True)
461
+
462
+ except json.JSONDecodeError as e:
463
+ logger.error(f"Invalid JSON: {e}")
464
+ error_response = {
465
+ "error": {
466
+ "code": -32700,
467
+ "message": "Parse error"
468
+ }
469
+ }
470
+ print(json.dumps(error_response), flush=True)
471
+ except Exception as e:
472
+ logger.exception("Error handling request")
473
+ error_response = {
474
+ "error": {
475
+ "code": -32603,
476
+ "message": str(e)
477
+ }
478
+ }
479
+ print(json.dumps(error_response), flush=True)
480
+
481
+
482
+ def create_server() -> EmpathyMCPServer:
483
+ """Create and return an Empathy MCP server instance.
484
+
485
+ Returns:
486
+ Configured MCP server
487
+ """
488
+ return EmpathyMCPServer()
489
+
490
+
491
+ def main():
492
+ """Entry point for MCP server."""
493
+ logging.basicConfig(
494
+ level=logging.INFO,
495
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
496
+ handlers=[logging.FileHandler('/tmp/empathy-mcp.log')]
497
+ )
498
+
499
+ try:
500
+ asyncio.run(main_loop())
501
+ except KeyboardInterrupt:
502
+ logger.info("Empathy MCP Server stopped")
503
+
504
+
505
+ if __name__ == "__main__":
506
+ main()