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,166 @@
1
+ """Sync commands for pattern synchronization.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+ import json as json_mod
8
+ from pathlib import Path
9
+
10
+ from attune.config import _validate_file_path
11
+ from attune.logging_config import get_logger
12
+
13
+ logger = get_logger(__name__)
14
+
15
+
16
+ def cmd_sync_claude(args):
17
+ """Sync patterns to Claude Code rules directory.
18
+
19
+ Converts learned patterns into Claude Code markdown rules.
20
+
21
+ Args:
22
+ args: Namespace object from argparse with attributes:
23
+ - patterns_dir (str): Source patterns directory.
24
+ - output_dir (str): Target Claude Code rules directory.
25
+
26
+ Returns:
27
+ int: 0 on success, 1 on failure.
28
+
29
+ Raises:
30
+ ValueError: If output path is invalid or unsafe.
31
+ """
32
+ patterns_dir = Path(args.patterns_dir)
33
+ # Validate output directory path
34
+ validated_output_dir = _validate_file_path(args.output_dir)
35
+ output_dir = validated_output_dir
36
+
37
+ print("=" * 60)
38
+ print(" SYNC PATTERNS TO CLAUDE CODE")
39
+ print("=" * 60 + "\n")
40
+
41
+ if not patterns_dir.exists():
42
+ print(f"✗ Patterns directory not found: {patterns_dir}")
43
+ print(" Run 'empathy learn --analyze 20' first to learn patterns")
44
+ return 1
45
+
46
+ # Create output directory
47
+ output_dir.mkdir(parents=True, exist_ok=True)
48
+
49
+ synced_count = 0
50
+ pattern_files = ["debugging.json", "security.json", "tech_debt.json", "inspection.json"]
51
+
52
+ for pattern_file in pattern_files:
53
+ source_path = patterns_dir / pattern_file
54
+ if not source_path.exists():
55
+ continue
56
+
57
+ try:
58
+ with open(source_path) as f:
59
+ data = json_mod.load(f)
60
+
61
+ patterns = data.get("patterns", data.get("items", []))
62
+ if not patterns:
63
+ continue
64
+
65
+ # Generate markdown rule file
66
+ category = pattern_file.replace(".json", "")
67
+ rule_content = _generate_claude_rule(category, patterns)
68
+
69
+ # Write rule file
70
+ rule_file = output_dir / f"{category}.md"
71
+ # Validate rule file path before writing
72
+ validated_rule_file = _validate_file_path(str(rule_file), allowed_dir=str(output_dir))
73
+ with open(validated_rule_file, "w") as f:
74
+ f.write(rule_content)
75
+
76
+ print(f" ✓ {category}: {len(patterns)} patterns → {rule_file}")
77
+ synced_count += len(patterns)
78
+
79
+ except (json_mod.JSONDecodeError, OSError) as e:
80
+ print(f" ✗ Failed to process {pattern_file}: {e}")
81
+
82
+ print(f"\n{'─' * 60}")
83
+ print(f" Total: {synced_count} patterns synced to {output_dir}")
84
+ print("=" * 60 + "\n")
85
+
86
+ if synced_count == 0:
87
+ print("No patterns to sync. Run 'empathy learn' first.")
88
+ return 1
89
+
90
+ return 0
91
+
92
+
93
+ def _generate_claude_rule(category: str, patterns: list) -> str:
94
+ """Generate a Claude Code rule file from patterns."""
95
+ lines = [
96
+ f"# {category.replace('_', ' ').title()} Patterns",
97
+ "",
98
+ "Auto-generated from Empathy Framework learned patterns.",
99
+ f"Total patterns: {len(patterns)}",
100
+ "",
101
+ "---",
102
+ "",
103
+ ]
104
+
105
+ if category == "debugging":
106
+ lines.extend(
107
+ [
108
+ "## Bug Fix Patterns",
109
+ "",
110
+ "When debugging similar issues, consider these historical fixes:",
111
+ "",
112
+ ],
113
+ )
114
+ for p in patterns[:20]: # Limit to 20 most recent
115
+ bug_type = p.get("bug_type", "unknown")
116
+ root_cause = p.get("root_cause", "Unknown")
117
+ fix = p.get("fix", "See commit history")
118
+ files = p.get("files_affected", [])
119
+
120
+ lines.append(f"### {bug_type}")
121
+ lines.append(f"- **Root cause**: {root_cause}")
122
+ lines.append(f"- **Fix**: {fix}")
123
+ if files:
124
+ lines.append(f"- **Files**: {', '.join(files[:3])}")
125
+ lines.append("")
126
+
127
+ elif category == "security":
128
+ lines.extend(
129
+ [
130
+ "## Security Decisions",
131
+ "",
132
+ "Previously reviewed security items:",
133
+ "",
134
+ ],
135
+ )
136
+ for p in patterns[:20]:
137
+ decision = p.get("decision", "unknown")
138
+ reason = p.get("reason", "")
139
+ lines.append(f"- **{p.get('type', 'unknown')}**: {decision}")
140
+ if reason:
141
+ lines.append(f" - Reason: {reason}")
142
+ lines.append("")
143
+
144
+ elif category == "tech_debt":
145
+ lines.extend(
146
+ [
147
+ "## Tech Debt Tracking",
148
+ "",
149
+ "Known technical debt items:",
150
+ "",
151
+ ],
152
+ )
153
+ for p in patterns[:20]:
154
+ lines.append(f"- {p.get('description', str(p))}")
155
+
156
+ else:
157
+ lines.extend(
158
+ [
159
+ f"## {category.title()} Items",
160
+ "",
161
+ ],
162
+ )
163
+ for p in patterns[:20]:
164
+ lines.append(f"- {p.get('description', str(p)[:100])}")
165
+
166
+ return "\n".join(lines)
@@ -0,0 +1,121 @@
1
+ """Tier management commands for intelligent model selection.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+
8
+ def cmd_tier_recommend(args):
9
+ """Get intelligent tier recommendation for a bug/task.
10
+
11
+ Analyzes bug description and historical patterns to recommend
12
+ the most cost-effective tier (HAIKU/SONNET/OPUS).
13
+
14
+ Args:
15
+ args: Namespace object from argparse with attributes:
16
+ - description (str): Bug or task description to analyze.
17
+ - files (str | None): Comma-separated list of affected files.
18
+ - complexity (str | None): Complexity hint (low/medium/high).
19
+
20
+ Returns:
21
+ None: Prints tier recommendation with confidence and expected cost.
22
+ """
23
+ from attune.tier_recommender import TierRecommender
24
+
25
+ recommender = TierRecommender()
26
+
27
+ # Get recommendation
28
+ result = recommender.recommend(
29
+ bug_description=args.description,
30
+ files_affected=args.files.split(",") if args.files else None,
31
+ complexity_hint=args.complexity,
32
+ )
33
+
34
+ # Display results
35
+ print()
36
+ print("=" * 60)
37
+ print(" TIER RECOMMENDATION")
38
+ print("=" * 60)
39
+ print()
40
+ print(f" Bug/Task: {args.description}")
41
+ print()
42
+ print(f" 📍 Recommended Tier: {result.tier}")
43
+ print(f" 🎯 Confidence: {result.confidence * 100:.1f}%")
44
+ print(f" 💰 Expected Cost: ${result.expected_cost:.3f}")
45
+ print(f" 🔄 Expected Attempts: {result.expected_attempts:.1f}")
46
+ print()
47
+ print(" 📊 Reasoning:")
48
+ print(f" {result.reasoning}")
49
+ print()
50
+
51
+ if result.similar_patterns_count > 0:
52
+ print(f" ✅ Based on {result.similar_patterns_count} similar patterns")
53
+ else:
54
+ print(" ⚠️ No historical data - using conservative default")
55
+
56
+ if result.fallback_used:
57
+ print()
58
+ print(" 💡 Tip: As more patterns are collected, recommendations")
59
+ print(" will become more accurate and personalized.")
60
+
61
+ print()
62
+ print("=" * 60)
63
+ print()
64
+
65
+
66
+ def cmd_tier_stats(args):
67
+ """Show tier pattern learning statistics.
68
+
69
+ Displays statistics about collected patterns and tier distribution.
70
+
71
+ Args:
72
+ args: Namespace object from argparse (no additional attributes used).
73
+
74
+ Returns:
75
+ None: Prints tier statistics, savings percentages, and bug type distribution.
76
+ """
77
+ from attune.tier_recommender import TierRecommender
78
+
79
+ recommender = TierRecommender()
80
+ stats = recommender.get_stats()
81
+
82
+ print()
83
+ print("=" * 60)
84
+ print(" TIER PATTERN LEARNING STATS")
85
+ print("=" * 60)
86
+ print()
87
+
88
+ if stats.get("total_patterns", 0) == 0:
89
+ print(" No patterns collected yet.")
90
+ print()
91
+ print(" 💡 Patterns are automatically collected as you use")
92
+ print(" cascading workflows with enhanced tracking enabled.")
93
+ print()
94
+ print("=" * 60)
95
+ print()
96
+ return
97
+
98
+ print(f" Total Patterns: {stats['total_patterns']}")
99
+ print(f" Avg Savings: {stats['avg_savings_percent']}%")
100
+ print()
101
+
102
+ print(" TIER DISTRIBUTION")
103
+ print(" " + "-" * 40)
104
+ for tier, count in stats["patterns_by_tier"].items():
105
+ percent = (count / stats["total_patterns"]) * 100
106
+ bar = "█" * int(percent / 5)
107
+ print(f" {tier:10} {count:3} ({percent:5.1f}%) {bar}")
108
+ print()
109
+
110
+ print(" BUG TYPE DISTRIBUTION")
111
+ print(" " + "-" * 40)
112
+ sorted_types = sorted(
113
+ stats["bug_type_distribution"].items(), key=lambda x: x[1], reverse=True
114
+ )
115
+ for bug_type, count in sorted_types[:10]:
116
+ percent = (count / stats["total_patterns"]) * 100
117
+ print(f" {bug_type:20} {count:3} ({percent:5.1f}%)")
118
+
119
+ print()
120
+ print("=" * 60)
121
+ print()
@@ -0,0 +1,114 @@
1
+ """Utility commands for Empathy Framework CLI.
2
+
3
+ General-purpose utility commands (sync, cheatsheet, dashboard, etc.).
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ import subprocess
10
+ import sys
11
+
12
+ import typer
13
+ from rich.panel import Panel
14
+
15
+ from attune.cli.core import console
16
+
17
+ # Create the utilities Typer app
18
+ utilities_app = typer.Typer(
19
+ help="Utility tools - project init, cheatsheet, dashboard, costs",
20
+ no_args_is_help=True,
21
+ )
22
+
23
+
24
+ @utilities_app.command("sync-claude")
25
+ def sync_claude(
26
+ source: str = typer.Option("patterns", "--source", "-s", help="Source to sync"),
27
+ ) -> None:
28
+ """Sync patterns to Claude Code memory."""
29
+ subprocess.run(["empathy-sync-claude", "--source", source], check=False)
30
+
31
+
32
+ @utilities_app.command("cheatsheet")
33
+ def cheatsheet() -> None:
34
+ """Show quick reference for all commands."""
35
+ console.print(
36
+ Panel.fit(
37
+ """[bold]Getting Started[/bold]
38
+ empathy morning Start-of-day briefing
39
+ empathy health Quick health check
40
+ empathy ship Pre-commit validation
41
+ empathy run Interactive REPL
42
+
43
+ [bold]Memory System[/bold]
44
+ empathy memory status Check Redis & patterns
45
+ empathy memory start Start Redis server
46
+ empathy memory patterns List stored patterns
47
+
48
+ [bold]Cross-Session Service[/bold]
49
+ empathy service start Start coordination service
50
+ empathy service status Show service & sessions
51
+ empathy service sessions List active agents
52
+
53
+ [bold]Provider Config[/bold]
54
+ empathy provider Show current config
55
+ empathy provider --set hybrid Use best-of-breed
56
+ empathy provider registry List all models
57
+
58
+ [bold]Code Inspection[/bold]
59
+ empathy scan . Scan for issues
60
+ empathy inspect . Deep analysis (SARIF)
61
+ empathy fix-all Auto-fix everything
62
+
63
+ [bold]Profiling[/bold]
64
+ empathy profile memory-scan Scan for memory leaks
65
+ empathy profile hot-files Show riskiest files
66
+ empathy profile memory-test Profile memory module
67
+
68
+ [bold]Pattern Learning[/bold]
69
+ empathy learn --analyze 20 Learn from commits
70
+ empathy utilities sync-claude Sync to Claude Code
71
+
72
+ [bold]Workflows[/bold]
73
+ empathy workflow list Show available workflows
74
+ empathy workflow run <name> Execute a workflow
75
+ empathy workflow create <name> -p <patterns> Create workflow (12x faster)
76
+ empathy workflow list-patterns List available patterns
77
+
78
+ [bold]Workflows[/bold]
79
+ empathy workflow list Show available workflows
80
+ empathy workflow run <name> Execute a workflow
81
+ empathy workflow create <name> -d <domain> Create workflow (12x faster)
82
+ empathy workflow list-patterns List available patterns
83
+
84
+ [bold]Usage Telemetry[/bold]
85
+ empathy telemetry show View recent LLM calls & costs
86
+ empathy telemetry savings Calculate cost savings (tier routing)
87
+ empathy telemetry export Export usage data (JSON/CSV)""",
88
+ title="[bold blue]Empathy Framework Cheatsheet[/bold blue]",
89
+ )
90
+ )
91
+
92
+
93
+ @utilities_app.command("dashboard")
94
+ def dashboard() -> None:
95
+ """Launch visual dashboard."""
96
+ subprocess.run([sys.executable, "-m", "attune.cli", "dashboard"], check=False)
97
+
98
+
99
+ @utilities_app.command("costs")
100
+ def costs() -> None:
101
+ """View API cost tracking."""
102
+ subprocess.run([sys.executable, "-m", "attune.cli", "costs"], check=False)
103
+
104
+
105
+ @utilities_app.command("init")
106
+ def init() -> None:
107
+ """Create a new configuration file."""
108
+ subprocess.run([sys.executable, "-m", "attune.cli", "init"], check=False)
109
+
110
+
111
+ @utilities_app.command("status")
112
+ def status() -> None:
113
+ """What needs attention now."""
114
+ subprocess.run([sys.executable, "-m", "attune.cli", "status"], check=False)