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,331 @@
1
+ """Help and information commands for the CLI.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+ from importlib.metadata import version as get_version
8
+
9
+ from attune.logging_config import get_logger
10
+
11
+ from ..utils.data import CHEATSHEET, EXPLAIN_CONTENT
12
+ from ..utils.helpers import _file_exists, _show_achievements
13
+
14
+ logger = get_logger(__name__)
15
+
16
+
17
+ def cmd_version(args):
18
+ """Display version information for Empathy Framework.
19
+
20
+ Args:
21
+ args: Namespace object from argparse (no additional attributes used).
22
+
23
+ Returns:
24
+ None: Prints version, copyright, and license information to stdout.
25
+ """
26
+ logger.info("Displaying version information")
27
+ try:
28
+ version = get_version("empathy")
29
+ except Exception as e:
30
+ # Package metadata not available or invalid (development install)
31
+ logger.debug(f"Version not available: {e}")
32
+ version = "unknown"
33
+ logger.info(f"Empathy v{version}")
34
+ logger.info("Copyright 2025 Smart-AI-Memory")
35
+ logger.info("Licensed under Fair Source License 0.9")
36
+ logger.info("\n✨ Built with Claude Code + MemDocs + VS Code transformative stack")
37
+
38
+
39
+ def cmd_cheatsheet(args):
40
+ """Display quick reference cheatsheet for all commands.
41
+
42
+ Args:
43
+ args: Namespace object from argparse with attributes:
44
+ - category (str | None): Specific category to show (e.g., 'daily-workflow').
45
+ - compact (bool): If True, show commands only without descriptions.
46
+
47
+ Returns:
48
+ None: Prints formatted cheatsheet to stdout.
49
+ """
50
+ category = getattr(args, "category", None)
51
+ compact = getattr(args, "compact", False)
52
+
53
+ print()
54
+ print("=" * 60)
55
+ print(" EMPATHY FRAMEWORK - QUICK REFERENCE")
56
+ print("=" * 60)
57
+
58
+ if category:
59
+ # Show specific category
60
+ category_title = category.replace("-", " ").title()
61
+ if category_title in CHEATSHEET:
62
+ print(f"\n {category_title}")
63
+ print(" " + "-" * 40)
64
+ for cmd, desc in CHEATSHEET[category_title]:
65
+ if compact:
66
+ print(f" {cmd}")
67
+ else:
68
+ print(f" {cmd:35} {desc}")
69
+ else:
70
+ print(f"\n Unknown category: {category}")
71
+ print(" Available: " + ", ".join(k.lower().replace(" ", "-") for k in CHEATSHEET))
72
+ else:
73
+ # Show all categories
74
+ for cat_name, commands in CHEATSHEET.items():
75
+ print(f"\n {cat_name}")
76
+ print(" " + "-" * 40)
77
+ for cmd, desc in commands:
78
+ if compact:
79
+ print(f" {cmd}")
80
+ else:
81
+ print(f" {cmd:35} {desc}")
82
+
83
+ print()
84
+ print("-" * 60)
85
+ print(" Use: empathy <command> --explain for detailed explanation")
86
+ print(" Use: empathy onboard for interactive tutorial")
87
+ print("=" * 60)
88
+ print()
89
+
90
+
91
+ def cmd_onboard(args):
92
+ """Interactive onboarding tutorial for new users.
93
+
94
+ Guides users through setup steps: init, learn, sync-claude, health check.
95
+
96
+ Args:
97
+ args: Namespace object from argparse with attributes:
98
+ - step (int | None): Jump to specific tutorial step (1-5).
99
+ - reset (bool): If True, reset onboarding progress.
100
+
101
+ Returns:
102
+ None: Prints tutorial content and tracks progress.
103
+ """
104
+ from attune.discovery import get_engine
105
+
106
+ step = getattr(args, "step", None)
107
+ reset = getattr(args, "reset", False)
108
+
109
+ engine = get_engine()
110
+ stats = engine.get_stats()
111
+
112
+ if reset:
113
+ # Reset onboarding progress
114
+ engine.state["onboarding_step"] = 0
115
+ engine.state["onboarding_completed"] = []
116
+ engine._save()
117
+ print("Onboarding progress reset.")
118
+ return
119
+
120
+ # Define onboarding steps
121
+ steps = [
122
+ {
123
+ "title": "Welcome to Empathy Framework",
124
+ "content": """
125
+ Welcome! Empathy Framework helps you build AI systems with 5 levels
126
+ of sophistication, from reactive responses to anticipatory assistance.
127
+
128
+ This tutorial will walk you through the key features.
129
+
130
+ Let's check your current setup first...
131
+ """,
132
+ "check": lambda: True,
133
+ "action": None,
134
+ },
135
+ {
136
+ "title": "Step 1: Initialize Your Project",
137
+ "content": """
138
+ First, let's create a configuration file for your project.
139
+
140
+ Run: empathy init
141
+
142
+ This creates attune.config.yaml with sensible defaults.
143
+ Alternatively, use 'empathy workflow' for an interactive setup.
144
+ """,
145
+ "check": lambda: _file_exists("attune.config.yaml")
146
+ or _file_exists("attune.config.yml"),
147
+ "action": "empathy init",
148
+ },
149
+ {
150
+ "title": "Step 2: Learn From Your History",
151
+ "content": """
152
+ Empathy can learn patterns from your git commit history.
153
+ This teaches Claude about your codebase's patterns and past bugs.
154
+
155
+ Run: empathy learn --analyze 10
156
+
157
+ This analyzes the last 10 commits and extracts:
158
+ - Bug fix patterns
159
+ - Security decisions
160
+ - Technical debt markers
161
+ """,
162
+ "check": lambda: _file_exists("patterns/debugging.json"),
163
+ "action": "empathy learn --analyze 10",
164
+ },
165
+ {
166
+ "title": "Step 3: Sync Patterns to Claude",
167
+ "content": """
168
+ Now let's share what we learned with Claude Code.
169
+
170
+ Run: empathy sync-claude
171
+
172
+ This creates .claude/rules/empathy/ with markdown rules
173
+ that Claude Code automatically loads when you work in this directory.
174
+ """,
175
+ "check": lambda: _file_exists(".claude/rules/empathy/debugging.md"),
176
+ "action": "empathy sync-claude",
177
+ },
178
+ {
179
+ "title": "Step 4: Check Code Health",
180
+ "content": """
181
+ Let's run a quick health check on your codebase.
182
+
183
+ Run: empathy health
184
+
185
+ This checks:
186
+ - Linting issues
187
+ - Type errors
188
+ - Formatting problems
189
+
190
+ Try 'empathy health --fix' to auto-fix what's possible.
191
+ """,
192
+ "check": lambda: stats.get("command_counts", {}).get("health", 0) > 0,
193
+ "action": "empathy health",
194
+ },
195
+ {
196
+ "title": "Step 5: Daily Workflow",
197
+ "content": """
198
+ You're almost there! Here's your recommended daily workflow:
199
+
200
+ MORNING:
201
+ empathy morning - Get your priority briefing
202
+
203
+ BEFORE COMMITS:
204
+ empathy ship - Validate before committing
205
+
206
+ WEEKLY:
207
+ empathy learn - Update patterns from new commits
208
+ empathy sync-claude - Keep Claude current
209
+
210
+ You've completed the basics! Run 'empathy cheatsheet' anytime
211
+ for a quick reference of all commands.
212
+ """,
213
+ "check": lambda: True,
214
+ "action": None,
215
+ },
216
+ ]
217
+
218
+ # Determine current step
219
+ current_step = engine.state.get("onboarding_step", 0)
220
+ if step is not None:
221
+ current_step = max(0, min(step - 1, len(steps) - 1))
222
+
223
+ step_data = steps[current_step]
224
+
225
+ # Display header
226
+ print()
227
+ print("=" * 60)
228
+ print(f" ONBOARDING ({current_step + 1}/{len(steps)})")
229
+ print("=" * 60)
230
+ print()
231
+ print(f" {step_data['title']}")
232
+ print(" " + "-" * 50)
233
+ print(step_data["content"])
234
+
235
+ # Check if step is completed
236
+ if step_data["check"]():
237
+ if current_step < len(steps) - 1:
238
+ print(" [DONE] This step is complete!")
239
+ print()
240
+ print(f" Continue with: empathy onboard --step {current_step + 2}")
241
+ # Auto-advance
242
+ engine.state["onboarding_step"] = current_step + 1
243
+ engine._save()
244
+ else:
245
+ print(" Congratulations! You've completed the onboarding!")
246
+ print()
247
+ _show_achievements(engine)
248
+ elif step_data["action"]:
249
+ print(f" NEXT: Run '{step_data['action']}'")
250
+ print(" Then run 'empathy onboard' to continue")
251
+
252
+ print()
253
+ print("-" * 60)
254
+ print(f" Progress: {'*' * (current_step + 1)}{'.' * (len(steps) - current_step - 1)}")
255
+ print("=" * 60)
256
+ print()
257
+
258
+
259
+ def cmd_explain(args):
260
+ """Show detailed explanation for a command.
261
+
262
+ Provides in-depth documentation about how specific commands work.
263
+
264
+ Args:
265
+ args: Namespace object from argparse with attributes:
266
+ - command (str): Command name to explain (e.g., 'morning', 'ship').
267
+
268
+ Returns:
269
+ None: Prints detailed explanation to stdout.
270
+ """
271
+ command = args.command
272
+
273
+ if command in EXPLAIN_CONTENT:
274
+ print(EXPLAIN_CONTENT[command])
275
+ else:
276
+ available = ", ".join(EXPLAIN_CONTENT.keys())
277
+ print(f"\nNo detailed explanation available for '{command}'")
278
+ print(f"Available: {available}")
279
+ print("\nTry: empathy cheatsheet for a quick reference")
280
+ print()
281
+
282
+
283
+ def cmd_achievements(args):
284
+ """Show user achievements and progress.
285
+
286
+ Displays gamification stats including unlocked achievements and usage streaks.
287
+
288
+ Args:
289
+ args: Namespace object from argparse (no additional attributes used).
290
+
291
+ Returns:
292
+ None: Prints achievements and progress to stdout.
293
+ """
294
+ from attune.discovery import get_engine
295
+
296
+ engine = get_engine()
297
+ stats = engine.get_stats()
298
+
299
+ print()
300
+ print("=" * 60)
301
+ print(" YOUR EMPATHY FRAMEWORK JOURNEY")
302
+ print("=" * 60)
303
+ print()
304
+
305
+ # Stats summary
306
+ print(" STATISTICS")
307
+ print(" " + "-" * 40)
308
+ print(f" Total commands run: {stats.get('total_commands', 0)}")
309
+ print(f" Days active: {stats.get('days_active', 0)}")
310
+ print(f" Patterns learned: {stats.get('patterns_learned', 0)}")
311
+ shown = stats.get("tips_shown", 0)
312
+ total = shown + stats.get("tips_remaining", 0)
313
+ print(f" Tips discovered: {shown}/{total}")
314
+ print()
315
+
316
+ # Command breakdown
317
+ cmd_counts = stats.get("command_counts", {})
318
+ if cmd_counts:
319
+ print(" COMMAND USAGE")
320
+ print(" " + "-" * 40)
321
+ sorted_cmds = sorted(cmd_counts.items(), key=lambda x: x[1], reverse=True)
322
+ for cmd, count in sorted_cmds[:10]:
323
+ bar = "*" * min(count, 20)
324
+ print(f" {cmd:15} {count:4} {bar}")
325
+ print()
326
+
327
+ # Achievements
328
+ _show_achievements(engine)
329
+
330
+ print("=" * 60)
331
+ print()
@@ -0,0 +1,140 @@
1
+ """Framework information commands.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+ from attune import load_config
8
+ from attune.logging_config import get_logger
9
+
10
+ logger = get_logger(__name__)
11
+
12
+
13
+ def cmd_info(args):
14
+ """Display information about the framework.
15
+
16
+ Shows configuration, persistence, and feature status.
17
+
18
+ Args:
19
+ args: Namespace object from argparse with attributes:
20
+ - config (str | None): Optional path to configuration file.
21
+
22
+ Returns:
23
+ None: Prints framework information to stdout.
24
+ """
25
+ config_file = args.config
26
+ logger.info("Displaying framework information")
27
+
28
+ if config_file:
29
+ logger.debug(f"Loading config from file: {config_file}")
30
+ config = load_config(filepath=config_file)
31
+ else:
32
+ logger.debug("Loading default configuration")
33
+ config = load_config()
34
+
35
+ logger.info("=== Empathy Framework Info ===\n")
36
+ logger.info("Configuration:")
37
+ logger.info(f" User ID: {config.user_id}")
38
+ logger.info(f" Target Level: {config.target_level}")
39
+ logger.info(f" Confidence Threshold: {config.confidence_threshold}")
40
+ logger.info("\nPersistence:")
41
+ logger.info(f" Backend: {config.persistence_backend}")
42
+ logger.info(f" Path: {config.persistence_path}")
43
+ logger.info(f" Enabled: {config.persistence_enabled}")
44
+ logger.info("\nMetrics:")
45
+ logger.info(f" Enabled: {config.metrics_enabled}")
46
+ logger.info(f" Path: {config.metrics_path}")
47
+ logger.info("\nPattern Library:")
48
+ logger.info(f" Enabled: {config.pattern_library_enabled}")
49
+ logger.info(f" Pattern Sharing: {config.pattern_sharing}")
50
+ logger.info(f" Confidence Threshold: {config.pattern_confidence_threshold}")
51
+
52
+
53
+ def cmd_frameworks(args):
54
+ """List and manage agent frameworks.
55
+
56
+ Displays available agent frameworks with their capabilities and recommendations.
57
+
58
+ Args:
59
+ args: Namespace object from argparse with attributes:
60
+ - all (bool): If True, show all frameworks including experimental.
61
+ - recommend (str | None): Use case for framework recommendation.
62
+ - json (bool): If True, output as JSON format.
63
+
64
+ Returns:
65
+ int: 0 on success, 1 on failure.
66
+ """
67
+ import json as json_mod
68
+
69
+ try:
70
+ from attune_llm.agent_factory import AgentFactory
71
+ from attune_llm.agent_factory.framework import (
72
+ get_framework_info,
73
+ get_recommended_framework,
74
+ )
75
+ except ImportError:
76
+ print("Agent Factory not available. Install empathy-framework with all dependencies.")
77
+ return 1
78
+
79
+ show_all = getattr(args, "all", False)
80
+ recommend_use_case = getattr(args, "recommend", None)
81
+ output_json = getattr(args, "json", False)
82
+
83
+ if recommend_use_case:
84
+ # Recommend a framework
85
+ recommended = get_recommended_framework(recommend_use_case)
86
+ info = get_framework_info(recommended)
87
+
88
+ if output_json:
89
+ print(
90
+ json_mod.dumps(
91
+ {"use_case": recommend_use_case, "recommended": recommended.value, **info},
92
+ indent=2,
93
+ )
94
+ )
95
+ else:
96
+ print(f"\nRecommended framework for '{recommend_use_case}': {info['name']}")
97
+ print(f" Best for: {', '.join(info['best_for'])}")
98
+ if info.get("install_command"):
99
+ print(f" Install: {info['install_command']}")
100
+ print()
101
+ return 0
102
+
103
+ # List frameworks
104
+ frameworks = AgentFactory.list_frameworks(installed_only=not show_all)
105
+
106
+ if output_json:
107
+ print(
108
+ json_mod.dumps(
109
+ [
110
+ {
111
+ "id": f["framework"].value,
112
+ "name": f["name"],
113
+ "installed": f["installed"],
114
+ "best_for": f["best_for"],
115
+ "install_command": f.get("install_command"),
116
+ }
117
+ for f in frameworks
118
+ ],
119
+ indent=2,
120
+ )
121
+ )
122
+ else:
123
+ print("\n" + "=" * 60)
124
+ print(" AGENT FRAMEWORKS")
125
+ print("=" * 60 + "\n")
126
+
127
+ for f in frameworks:
128
+ status = "INSTALLED" if f["installed"] else "not installed"
129
+ print(f" {f['name']:20} [{status}]")
130
+ print(f" Best for: {', '.join(f['best_for'][:3])}")
131
+ if not f["installed"] and f.get("install_command"):
132
+ print(f" Install: {f['install_command']}")
133
+ print()
134
+
135
+ print("-" * 60)
136
+ print(" Use: empathy frameworks --recommend <use_case>")
137
+ print(" Use cases: general, rag, multi_agent, code_analysis")
138
+ print("=" * 60 + "\n")
139
+
140
+ return 0