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,33 @@
1
+ """Workflow Pattern Library.
2
+
3
+ Extracted patterns from 17 existing workflows for rapid workflow generation.
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ from .behavior import CodeScannerPattern, ConditionalTierPattern, ConfigDrivenPattern
10
+ from .core import PatternCategory, WorkflowComplexity, WorkflowPattern
11
+ from .output import ResultDataclassPattern
12
+ from .registry import WorkflowPatternRegistry, get_workflow_pattern_registry
13
+ from .structural import CrewBasedPattern, MultiStagePattern, SingleStagePattern
14
+
15
+ __all__ = [
16
+ # Core
17
+ "WorkflowPattern",
18
+ "PatternCategory",
19
+ "WorkflowComplexity",
20
+ # Structural
21
+ "SingleStagePattern",
22
+ "MultiStagePattern",
23
+ "CrewBasedPattern",
24
+ # Behavioral
25
+ "ConditionalTierPattern",
26
+ "ConfigDrivenPattern",
27
+ "CodeScannerPattern",
28
+ # Output
29
+ "ResultDataclassPattern",
30
+ # Registry
31
+ "WorkflowPatternRegistry",
32
+ "get_workflow_pattern_registry",
33
+ ]
@@ -0,0 +1,249 @@
1
+ """Behavioral workflow patterns.
2
+
3
+ Patterns for conditional execution and dynamic behavior.
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ from typing import Any
10
+
11
+ from .core import CodeSection, PatternCategory, WorkflowComplexity, WorkflowPattern
12
+
13
+
14
+ class ConditionalTierPattern(WorkflowPattern):
15
+ """Dynamic tier routing based on complexity or conditions.
16
+
17
+ Use for: Cost optimization by downgrading/skipping expensive stages.
18
+ Examples: bug-predict (skip premium if low risk), code-review (conditional architect review).
19
+ """
20
+
21
+ id: str = "conditional-tier"
22
+ name: str = "Conditional Tier Routing"
23
+ category: PatternCategory = PatternCategory.BEHAVIOR
24
+ description: str = "Dynamically adjust model tiers based on conditions"
25
+ complexity: WorkflowComplexity = WorkflowComplexity.MODERATE
26
+ use_cases: list[str] = [
27
+ "Cost optimization",
28
+ "Conditional premium tier usage",
29
+ "Complexity-based routing",
30
+ ]
31
+ examples: list[str] = ["bug-predict", "code-review", "pr-review"]
32
+ requires: list[str] = ["multi-stage"]
33
+ risk_weight: float = 3.0
34
+
35
+ def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
36
+ """Generate code for conditional tier routing."""
37
+ threshold_param = context.get("threshold_param", "complexity_threshold")
38
+ threshold_default = context.get("threshold_default", "0.7")
39
+ metric_name = context.get("metric_name", "complexity_score")
40
+
41
+ return [
42
+ CodeSection(
43
+ location="init_method",
44
+ code=f""" self.{threshold_param} = {threshold_param} if {threshold_param} is not None else {threshold_default}
45
+ self._{metric_name}: float = 0.0""",
46
+ priority=1,
47
+ ),
48
+ CodeSection(
49
+ location="methods",
50
+ code=f''' def should_skip_stage(self, stage_name: str, input_data: Any) -> tuple[bool, str | None]:
51
+ """Conditionally downgrade or skip stages based on {metric_name}.
52
+
53
+ Args:
54
+ stage_name: Name of the stage to check
55
+ input_data: Current workflow data
56
+
57
+ Returns:
58
+ Tuple of (should_skip, reason)
59
+
60
+ """
61
+ # Example: Downgrade premium stage if metric below threshold
62
+ if stage_name == "recommend" or stage_name == "architect_review":
63
+ if self._{metric_name} < self.{threshold_param}:
64
+ # Downgrade to CAPABLE instead of skipping
65
+ self.tier_map[stage_name] = ModelTier.CAPABLE
66
+ logger.info(f"Downgraded {{stage_name}} to CAPABLE ({metric_name}: {{self._{metric_name}:.2f}})")
67
+ return False, None
68
+ return False, None''',
69
+ priority=2,
70
+ ),
71
+ ]
72
+
73
+
74
+ class ConfigDrivenPattern(WorkflowPattern):
75
+ """Load configuration from attune.config.yml.
76
+
77
+ Use for: Configurable thresholds, options, and behavior.
78
+ Examples: bug-predict (risk threshold), health-check (check toggles).
79
+ """
80
+
81
+ id: str = "config-driven"
82
+ name: str = "Configuration-Driven Workflow"
83
+ category: PatternCategory = PatternCategory.BEHAVIOR
84
+ description: str = "Loads settings from attune.config.yml"
85
+ complexity: WorkflowComplexity = WorkflowComplexity.SIMPLE
86
+ use_cases: list[str] = [
87
+ "Configurable thresholds",
88
+ "User-customizable behavior",
89
+ "Environment-specific settings",
90
+ ]
91
+ examples: list[str] = ["bug-predict", "health-check", "security-audit"]
92
+ risk_weight: float = 1.5
93
+
94
+ def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
95
+ """Generate code for configuration loading."""
96
+ workflow_name = context.get("workflow_name", "my-workflow")
97
+ config_key = workflow_name.replace("-", "_")
98
+ config_params = context.get(
99
+ "config_params",
100
+ {
101
+ "threshold": 0.7,
102
+ "enabled": True,
103
+ },
104
+ )
105
+
106
+ # Generate defaults dict
107
+ defaults_code = " defaults = {\n"
108
+ for key, value in config_params.items():
109
+ if isinstance(value, str):
110
+ defaults_code += f' "{key}": "{value}",\n'
111
+ else:
112
+ defaults_code += f' "{key}": {value},\n'
113
+ defaults_code += " }"
114
+
115
+ # Generate config loading
116
+ return [
117
+ CodeSection(
118
+ location="imports",
119
+ code="import yaml\nfrom pathlib import Path",
120
+ priority=1,
121
+ ),
122
+ CodeSection(
123
+ location="helper_functions",
124
+ code=f'''def _load_{config_key}_config() -> dict:
125
+ """Load {config_key} configuration from attune.config.yml.
126
+
127
+ Returns:
128
+ Dict with {config_key} settings, or defaults if not found.
129
+
130
+ """
131
+ {defaults_code}
132
+
133
+ config_paths = [
134
+ Path("attune.config.yml"),
135
+ Path("attune.config.yaml"),
136
+ Path(".empathy.yml"),
137
+ Path(".empathy.yaml"),
138
+ ]
139
+
140
+ for config_path in config_paths:
141
+ if config_path.exists():
142
+ try:
143
+ with open(config_path) as f:
144
+ config = yaml.safe_load(f)
145
+ if config and "{config_key}" in config:
146
+ return {{**defaults, **config["{config_key}"]}}
147
+ except (yaml.YAMLError, OSError):
148
+ pass
149
+
150
+ return defaults''',
151
+ priority=1,
152
+ ),
153
+ CodeSection(
154
+ location="init_method",
155
+ code=f""" # Load configuration
156
+ self._config = _load_{config_key}_config()""",
157
+ priority=1,
158
+ ),
159
+ ]
160
+
161
+
162
+ class CodeScannerPattern(WorkflowPattern):
163
+ """File scanning and analysis capabilities.
164
+
165
+ Use for: Code analysis workflows that scan files.
166
+ Examples: bug-predict, security-audit, test-gen.
167
+ """
168
+
169
+ id: str = "code-scanner"
170
+ name: str = "Code Scanner"
171
+ category: PatternCategory = PatternCategory.BEHAVIOR
172
+ description: str = "Scan and analyze code files with pattern matching"
173
+ complexity: WorkflowComplexity = WorkflowComplexity.MODERATE
174
+ use_cases: list[str] = [
175
+ "Bug detection",
176
+ "Security scanning",
177
+ "Code analysis",
178
+ ]
179
+ examples: list[str] = ["bug-predict", "security-audit"]
180
+ risk_weight: float = 2.0
181
+
182
+ def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
183
+ """Generate code for file scanning."""
184
+ scan_pattern = context.get("scan_pattern", "*.py")
185
+
186
+ return [
187
+ CodeSection(
188
+ location="imports",
189
+ code="import fnmatch\nfrom pathlib import Path",
190
+ priority=1,
191
+ ),
192
+ CodeSection(
193
+ location="helper_functions",
194
+ code=f'''def _should_exclude_file(file_path: str, exclude_patterns: list[str]) -> bool:
195
+ """Check if a file should be excluded based on glob patterns.
196
+
197
+ Args:
198
+ file_path: Path to the file
199
+ exclude_patterns: List of glob patterns (e.g., "**/test_*.py")
200
+
201
+ Returns:
202
+ True if the file matches any exclusion pattern.
203
+
204
+ """
205
+ for pattern in exclude_patterns:
206
+ if "**" in pattern:
207
+ parts = pattern.split("**")
208
+ if len(parts) == 2:
209
+ prefix, suffix = parts
210
+ if prefix and not file_path.startswith(prefix.rstrip("/")):
211
+ continue
212
+ if suffix and fnmatch.fnmatch(file_path, f"*{{suffix}}"):
213
+ return True
214
+ elif fnmatch.fnmatch(file_path, pattern) or fnmatch.fnmatch(
215
+ Path(file_path).name,
216
+ pattern,
217
+ ):
218
+ return True
219
+ return False
220
+
221
+
222
+ def _scan_files(
223
+ root_dir: str = ".",
224
+ pattern: str = "{scan_pattern}",
225
+ exclude: list[str] | None = None,
226
+ ) -> list[Path]:
227
+ """Scan directory for files matching pattern.
228
+
229
+ Args:
230
+ root_dir: Root directory to scan
231
+ pattern: Glob pattern for files
232
+ exclude: Exclusion patterns
233
+
234
+ Returns:
235
+ List of matching file paths
236
+
237
+ """
238
+ exclude = exclude or []
239
+ root = Path(root_dir)
240
+ files = []
241
+
242
+ for file_path in root.rglob(pattern):
243
+ if file_path.is_file() and not _should_exclude_file(str(file_path), exclude):
244
+ files.append(file_path)
245
+
246
+ return files''',
247
+ priority=1,
248
+ ),
249
+ ]
@@ -0,0 +1,76 @@
1
+ """Core workflow pattern definitions.
2
+
3
+ Defines Pydantic models for workflow patterns extracted from existing workflows.
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ from dataclasses import dataclass
10
+ from enum import Enum
11
+ from typing import Any
12
+
13
+ from pydantic import BaseModel, Field
14
+
15
+
16
+ class PatternCategory(Enum):
17
+ """Categories for workflow patterns."""
18
+
19
+ STRUCTURAL = "structural" # How workflow is organized
20
+ TIER = "tier" # Tier routing strategies
21
+ INTEGRATION = "integration" # External integrations
22
+ OUTPUT = "output" # Output formatting
23
+ BEHAVIOR = "behavior" # Behavioral patterns
24
+
25
+
26
+ class WorkflowComplexity(Enum):
27
+ """Workflow complexity levels."""
28
+
29
+ SIMPLE = "simple" # Single stage, no conditions
30
+ MODERATE = "moderate" # Multiple stages, some conditions
31
+ COMPLEX = "complex" # Multiple stages, conditional routing, crews
32
+
33
+
34
+ @dataclass
35
+ class CodeSection:
36
+ """A section of code to be generated."""
37
+
38
+ location: str # Where in the file (e.g., "imports", "class_body", "methods")
39
+ code: str # The code content
40
+ priority: int = 0 # Higher priority sections are placed first
41
+
42
+
43
+ class WorkflowPattern(BaseModel):
44
+ """Base model for workflow patterns."""
45
+
46
+ id: str = Field(..., description="Unique pattern identifier")
47
+ name: str = Field(..., description="Human-readable pattern name")
48
+ category: PatternCategory = Field(..., description="Pattern category")
49
+ description: str = Field(..., description="Pattern description")
50
+ complexity: WorkflowComplexity = Field(..., description="Pattern complexity")
51
+ use_cases: list[str] = Field(default_factory=list, description="When to use this pattern")
52
+ examples: list[str] = Field(
53
+ default_factory=list, description="Example workflows using this pattern"
54
+ )
55
+ conflicts_with: list[str] = Field(default_factory=list, description="Incompatible pattern IDs")
56
+ requires: list[str] = Field(default_factory=list, description="Required pattern IDs")
57
+ risk_weight: float = Field(
58
+ default=1.0, ge=0.0, le=5.0, description="Risk factor for testing (1=low, 5=high)"
59
+ )
60
+
61
+ def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
62
+ """Generate code sections for this pattern.
63
+
64
+ Args:
65
+ context: Context dictionary with workflow metadata
66
+
67
+ Returns:
68
+ List of CodeSection objects to be merged
69
+
70
+ """
71
+ raise NotImplementedError("Subclasses must implement generate_code_sections")
72
+
73
+ class Config:
74
+ """Pydantic config."""
75
+
76
+ use_enum_values = True
@@ -0,0 +1,99 @@
1
+ """Output formatting patterns.
2
+
3
+ Patterns for structured workflow results.
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ from typing import Any
10
+
11
+ from .core import CodeSection, PatternCategory, WorkflowComplexity, WorkflowPattern
12
+
13
+
14
+ class ResultDataclassPattern(WorkflowPattern):
15
+ """Structured output with dataclass.
16
+
17
+ Use for: Type-safe, structured workflow results.
18
+ Examples: health-check, release-prep.
19
+ """
20
+
21
+ id: str = "result-dataclass"
22
+ name: str = "Result Dataclass"
23
+ category: PatternCategory = PatternCategory.OUTPUT
24
+ description: str = "Structured output format with dataclass"
25
+ complexity: WorkflowComplexity = WorkflowComplexity.SIMPLE
26
+ use_cases: list[str] = [
27
+ "Type-safe results",
28
+ "Structured output",
29
+ "API integration",
30
+ ]
31
+ examples: list[str] = ["health-check", "release-prep"]
32
+ risk_weight: float = 1.0
33
+
34
+ def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
35
+ """Generate code for result dataclass."""
36
+ context.get("workflow_name", "my-workflow")
37
+ class_name = context.get("class_name", "MyWorkflow")
38
+ result_class_name = f"{class_name}Result"
39
+
40
+ # Get custom fields from context
41
+ custom_fields = context.get("result_fields", [])
42
+
43
+ # Generate custom fields code
44
+ custom_fields_code = ""
45
+ if custom_fields:
46
+ for field in custom_fields:
47
+ field_name = field.get("name", "custom_field")
48
+ field_type = field.get("type", "Any")
49
+ field_desc = field.get("description", "Custom field")
50
+ custom_fields_code += f" {field_name}: {field_type} # {field_desc}\n"
51
+
52
+ return [
53
+ CodeSection(
54
+ location="imports",
55
+ code="from dataclasses import dataclass, field",
56
+ priority=1,
57
+ ),
58
+ CodeSection(
59
+ location="dataclasses",
60
+ code=f'''@dataclass
61
+ class {result_class_name}:
62
+ """Result from {class_name} execution."""
63
+
64
+ success: bool
65
+ {custom_fields_code if custom_fields_code else " # Add custom fields here"}duration_seconds: float
66
+ cost: float
67
+ metadata: dict = field(default_factory=dict)''',
68
+ priority=1,
69
+ ),
70
+ CodeSection(
71
+ location="methods",
72
+ code=f''' def _create_result(
73
+ self,
74
+ success: bool,
75
+ duration: float,
76
+ cost: float,
77
+ **kwargs: Any,
78
+ ) -> {result_class_name}:
79
+ """Create structured result.
80
+
81
+ Args:
82
+ success: Whether workflow succeeded
83
+ duration: Execution duration in seconds
84
+ cost: Total cost in USD
85
+ **kwargs: Additional result fields
86
+
87
+ Returns:
88
+ {result_class_name} instance
89
+
90
+ """
91
+ return {result_class_name}(
92
+ success=success,
93
+ duration_seconds=duration,
94
+ cost=cost,
95
+ **kwargs,
96
+ )''',
97
+ priority=2,
98
+ ),
99
+ ]