attune-ai 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (457) hide show
  1. attune/__init__.py +358 -0
  2. attune/adaptive/__init__.py +13 -0
  3. attune/adaptive/task_complexity.py +127 -0
  4. attune/agent_monitoring.py +414 -0
  5. attune/cache/__init__.py +117 -0
  6. attune/cache/base.py +166 -0
  7. attune/cache/dependency_manager.py +256 -0
  8. attune/cache/hash_only.py +251 -0
  9. attune/cache/hybrid.py +457 -0
  10. attune/cache/storage.py +285 -0
  11. attune/cache_monitor.py +356 -0
  12. attune/cache_stats.py +298 -0
  13. attune/cli/__init__.py +152 -0
  14. attune/cli/__main__.py +12 -0
  15. attune/cli/commands/__init__.py +1 -0
  16. attune/cli/commands/batch.py +264 -0
  17. attune/cli/commands/cache.py +248 -0
  18. attune/cli/commands/help.py +331 -0
  19. attune/cli/commands/info.py +140 -0
  20. attune/cli/commands/inspect.py +436 -0
  21. attune/cli/commands/inspection.py +57 -0
  22. attune/cli/commands/memory.py +48 -0
  23. attune/cli/commands/metrics.py +92 -0
  24. attune/cli/commands/orchestrate.py +184 -0
  25. attune/cli/commands/patterns.py +207 -0
  26. attune/cli/commands/profiling.py +202 -0
  27. attune/cli/commands/provider.py +98 -0
  28. attune/cli/commands/routing.py +285 -0
  29. attune/cli/commands/setup.py +96 -0
  30. attune/cli/commands/status.py +235 -0
  31. attune/cli/commands/sync.py +166 -0
  32. attune/cli/commands/tier.py +121 -0
  33. attune/cli/commands/utilities.py +114 -0
  34. attune/cli/commands/workflow.py +579 -0
  35. attune/cli/core.py +32 -0
  36. attune/cli/parsers/__init__.py +68 -0
  37. attune/cli/parsers/batch.py +118 -0
  38. attune/cli/parsers/cache.py +65 -0
  39. attune/cli/parsers/help.py +41 -0
  40. attune/cli/parsers/info.py +26 -0
  41. attune/cli/parsers/inspect.py +66 -0
  42. attune/cli/parsers/metrics.py +42 -0
  43. attune/cli/parsers/orchestrate.py +61 -0
  44. attune/cli/parsers/patterns.py +54 -0
  45. attune/cli/parsers/provider.py +40 -0
  46. attune/cli/parsers/routing.py +110 -0
  47. attune/cli/parsers/setup.py +42 -0
  48. attune/cli/parsers/status.py +47 -0
  49. attune/cli/parsers/sync.py +31 -0
  50. attune/cli/parsers/tier.py +33 -0
  51. attune/cli/parsers/workflow.py +77 -0
  52. attune/cli/utils/__init__.py +1 -0
  53. attune/cli/utils/data.py +242 -0
  54. attune/cli/utils/helpers.py +68 -0
  55. attune/cli_legacy.py +3957 -0
  56. attune/cli_minimal.py +1159 -0
  57. attune/cli_router.py +437 -0
  58. attune/cli_unified.py +814 -0
  59. attune/config/__init__.py +66 -0
  60. attune/config/xml_config.py +286 -0
  61. attune/config.py +545 -0
  62. attune/coordination.py +870 -0
  63. attune/core.py +1511 -0
  64. attune/core_modules/__init__.py +15 -0
  65. attune/cost_tracker.py +626 -0
  66. attune/dashboard/__init__.py +41 -0
  67. attune/dashboard/app.py +512 -0
  68. attune/dashboard/simple_server.py +435 -0
  69. attune/dashboard/standalone_server.py +547 -0
  70. attune/discovery.py +306 -0
  71. attune/emergence.py +306 -0
  72. attune/exceptions.py +123 -0
  73. attune/feedback_loops.py +373 -0
  74. attune/hot_reload/README.md +473 -0
  75. attune/hot_reload/__init__.py +62 -0
  76. attune/hot_reload/config.py +83 -0
  77. attune/hot_reload/integration.py +229 -0
  78. attune/hot_reload/reloader.py +298 -0
  79. attune/hot_reload/watcher.py +183 -0
  80. attune/hot_reload/websocket.py +177 -0
  81. attune/levels.py +577 -0
  82. attune/leverage_points.py +441 -0
  83. attune/logging_config.py +261 -0
  84. attune/mcp/__init__.py +10 -0
  85. attune/mcp/server.py +506 -0
  86. attune/memory/__init__.py +237 -0
  87. attune/memory/claude_memory.py +469 -0
  88. attune/memory/config.py +224 -0
  89. attune/memory/control_panel.py +1290 -0
  90. attune/memory/control_panel_support.py +145 -0
  91. attune/memory/cross_session.py +845 -0
  92. attune/memory/edges.py +179 -0
  93. attune/memory/encryption.py +159 -0
  94. attune/memory/file_session.py +770 -0
  95. attune/memory/graph.py +570 -0
  96. attune/memory/long_term.py +913 -0
  97. attune/memory/long_term_types.py +99 -0
  98. attune/memory/mixins/__init__.py +25 -0
  99. attune/memory/mixins/backend_init_mixin.py +249 -0
  100. attune/memory/mixins/capabilities_mixin.py +208 -0
  101. attune/memory/mixins/handoff_mixin.py +208 -0
  102. attune/memory/mixins/lifecycle_mixin.py +49 -0
  103. attune/memory/mixins/long_term_mixin.py +352 -0
  104. attune/memory/mixins/promotion_mixin.py +109 -0
  105. attune/memory/mixins/short_term_mixin.py +182 -0
  106. attune/memory/nodes.py +179 -0
  107. attune/memory/redis_bootstrap.py +540 -0
  108. attune/memory/security/__init__.py +31 -0
  109. attune/memory/security/audit_logger.py +932 -0
  110. attune/memory/security/pii_scrubber.py +640 -0
  111. attune/memory/security/secrets_detector.py +678 -0
  112. attune/memory/short_term.py +2192 -0
  113. attune/memory/simple_storage.py +302 -0
  114. attune/memory/storage/__init__.py +15 -0
  115. attune/memory/storage_backend.py +167 -0
  116. attune/memory/summary_index.py +583 -0
  117. attune/memory/types.py +446 -0
  118. attune/memory/unified.py +182 -0
  119. attune/meta_workflows/__init__.py +74 -0
  120. attune/meta_workflows/agent_creator.py +248 -0
  121. attune/meta_workflows/builtin_templates.py +567 -0
  122. attune/meta_workflows/cli_commands/__init__.py +56 -0
  123. attune/meta_workflows/cli_commands/agent_commands.py +321 -0
  124. attune/meta_workflows/cli_commands/analytics_commands.py +442 -0
  125. attune/meta_workflows/cli_commands/config_commands.py +232 -0
  126. attune/meta_workflows/cli_commands/memory_commands.py +182 -0
  127. attune/meta_workflows/cli_commands/template_commands.py +354 -0
  128. attune/meta_workflows/cli_commands/workflow_commands.py +382 -0
  129. attune/meta_workflows/cli_meta_workflows.py +59 -0
  130. attune/meta_workflows/form_engine.py +292 -0
  131. attune/meta_workflows/intent_detector.py +409 -0
  132. attune/meta_workflows/models.py +569 -0
  133. attune/meta_workflows/pattern_learner.py +738 -0
  134. attune/meta_workflows/plan_generator.py +384 -0
  135. attune/meta_workflows/session_context.py +397 -0
  136. attune/meta_workflows/template_registry.py +229 -0
  137. attune/meta_workflows/workflow.py +984 -0
  138. attune/metrics/__init__.py +12 -0
  139. attune/metrics/collector.py +31 -0
  140. attune/metrics/prompt_metrics.py +194 -0
  141. attune/models/__init__.py +172 -0
  142. attune/models/__main__.py +13 -0
  143. attune/models/adaptive_routing.py +437 -0
  144. attune/models/auth_cli.py +444 -0
  145. attune/models/auth_strategy.py +450 -0
  146. attune/models/cli.py +655 -0
  147. attune/models/empathy_executor.py +354 -0
  148. attune/models/executor.py +257 -0
  149. attune/models/fallback.py +762 -0
  150. attune/models/provider_config.py +282 -0
  151. attune/models/registry.py +472 -0
  152. attune/models/tasks.py +359 -0
  153. attune/models/telemetry/__init__.py +71 -0
  154. attune/models/telemetry/analytics.py +594 -0
  155. attune/models/telemetry/backend.py +196 -0
  156. attune/models/telemetry/data_models.py +431 -0
  157. attune/models/telemetry/storage.py +489 -0
  158. attune/models/token_estimator.py +420 -0
  159. attune/models/validation.py +280 -0
  160. attune/monitoring/__init__.py +52 -0
  161. attune/monitoring/alerts.py +946 -0
  162. attune/monitoring/alerts_cli.py +448 -0
  163. attune/monitoring/multi_backend.py +271 -0
  164. attune/monitoring/otel_backend.py +362 -0
  165. attune/optimization/__init__.py +19 -0
  166. attune/optimization/context_optimizer.py +272 -0
  167. attune/orchestration/__init__.py +67 -0
  168. attune/orchestration/agent_templates.py +707 -0
  169. attune/orchestration/config_store.py +499 -0
  170. attune/orchestration/execution_strategies.py +2111 -0
  171. attune/orchestration/meta_orchestrator.py +1168 -0
  172. attune/orchestration/pattern_learner.py +696 -0
  173. attune/orchestration/real_tools.py +931 -0
  174. attune/pattern_cache.py +187 -0
  175. attune/pattern_library.py +542 -0
  176. attune/patterns/debugging/all_patterns.json +81 -0
  177. attune/patterns/debugging/workflow_20260107_1770825e.json +77 -0
  178. attune/patterns/refactoring_memory.json +89 -0
  179. attune/persistence.py +564 -0
  180. attune/platform_utils.py +265 -0
  181. attune/plugins/__init__.py +28 -0
  182. attune/plugins/base.py +361 -0
  183. attune/plugins/registry.py +268 -0
  184. attune/project_index/__init__.py +32 -0
  185. attune/project_index/cli.py +335 -0
  186. attune/project_index/index.py +667 -0
  187. attune/project_index/models.py +504 -0
  188. attune/project_index/reports.py +474 -0
  189. attune/project_index/scanner.py +777 -0
  190. attune/project_index/scanner_parallel.py +291 -0
  191. attune/prompts/__init__.py +61 -0
  192. attune/prompts/config.py +77 -0
  193. attune/prompts/context.py +177 -0
  194. attune/prompts/parser.py +285 -0
  195. attune/prompts/registry.py +313 -0
  196. attune/prompts/templates.py +208 -0
  197. attune/redis_config.py +302 -0
  198. attune/redis_memory.py +799 -0
  199. attune/resilience/__init__.py +56 -0
  200. attune/resilience/circuit_breaker.py +256 -0
  201. attune/resilience/fallback.py +179 -0
  202. attune/resilience/health.py +300 -0
  203. attune/resilience/retry.py +209 -0
  204. attune/resilience/timeout.py +135 -0
  205. attune/routing/__init__.py +43 -0
  206. attune/routing/chain_executor.py +433 -0
  207. attune/routing/classifier.py +217 -0
  208. attune/routing/smart_router.py +234 -0
  209. attune/routing/workflow_registry.py +343 -0
  210. attune/scaffolding/README.md +589 -0
  211. attune/scaffolding/__init__.py +35 -0
  212. attune/scaffolding/__main__.py +14 -0
  213. attune/scaffolding/cli.py +240 -0
  214. attune/scaffolding/templates/base_wizard.py.jinja2 +121 -0
  215. attune/scaffolding/templates/coach_wizard.py.jinja2 +321 -0
  216. attune/scaffolding/templates/domain_wizard.py.jinja2 +408 -0
  217. attune/scaffolding/templates/linear_flow_wizard.py.jinja2 +203 -0
  218. attune/socratic/__init__.py +256 -0
  219. attune/socratic/ab_testing.py +958 -0
  220. attune/socratic/blueprint.py +533 -0
  221. attune/socratic/cli.py +703 -0
  222. attune/socratic/collaboration.py +1114 -0
  223. attune/socratic/domain_templates.py +924 -0
  224. attune/socratic/embeddings.py +738 -0
  225. attune/socratic/engine.py +794 -0
  226. attune/socratic/explainer.py +682 -0
  227. attune/socratic/feedback.py +772 -0
  228. attune/socratic/forms.py +629 -0
  229. attune/socratic/generator.py +732 -0
  230. attune/socratic/llm_analyzer.py +637 -0
  231. attune/socratic/mcp_server.py +702 -0
  232. attune/socratic/session.py +312 -0
  233. attune/socratic/storage.py +667 -0
  234. attune/socratic/success.py +730 -0
  235. attune/socratic/visual_editor.py +860 -0
  236. attune/socratic/web_ui.py +958 -0
  237. attune/telemetry/__init__.py +39 -0
  238. attune/telemetry/agent_coordination.py +475 -0
  239. attune/telemetry/agent_tracking.py +367 -0
  240. attune/telemetry/approval_gates.py +545 -0
  241. attune/telemetry/cli.py +1231 -0
  242. attune/telemetry/commands/__init__.py +14 -0
  243. attune/telemetry/commands/dashboard_commands.py +696 -0
  244. attune/telemetry/event_streaming.py +409 -0
  245. attune/telemetry/feedback_loop.py +567 -0
  246. attune/telemetry/usage_tracker.py +591 -0
  247. attune/templates.py +754 -0
  248. attune/test_generator/__init__.py +38 -0
  249. attune/test_generator/__main__.py +14 -0
  250. attune/test_generator/cli.py +234 -0
  251. attune/test_generator/generator.py +355 -0
  252. attune/test_generator/risk_analyzer.py +216 -0
  253. attune/test_generator/templates/unit_test.py.jinja2 +272 -0
  254. attune/tier_recommender.py +384 -0
  255. attune/tools.py +183 -0
  256. attune/trust/__init__.py +28 -0
  257. attune/trust/circuit_breaker.py +579 -0
  258. attune/trust_building.py +527 -0
  259. attune/validation/__init__.py +19 -0
  260. attune/validation/xml_validator.py +281 -0
  261. attune/vscode_bridge.py +173 -0
  262. attune/workflow_commands.py +780 -0
  263. attune/workflow_patterns/__init__.py +33 -0
  264. attune/workflow_patterns/behavior.py +249 -0
  265. attune/workflow_patterns/core.py +76 -0
  266. attune/workflow_patterns/output.py +99 -0
  267. attune/workflow_patterns/registry.py +255 -0
  268. attune/workflow_patterns/structural.py +288 -0
  269. attune/workflows/__init__.py +539 -0
  270. attune/workflows/autonomous_test_gen.py +1268 -0
  271. attune/workflows/base.py +2667 -0
  272. attune/workflows/batch_processing.py +342 -0
  273. attune/workflows/bug_predict.py +1084 -0
  274. attune/workflows/builder.py +273 -0
  275. attune/workflows/caching.py +253 -0
  276. attune/workflows/code_review.py +1048 -0
  277. attune/workflows/code_review_adapters.py +312 -0
  278. attune/workflows/code_review_pipeline.py +722 -0
  279. attune/workflows/config.py +645 -0
  280. attune/workflows/dependency_check.py +644 -0
  281. attune/workflows/document_gen/__init__.py +25 -0
  282. attune/workflows/document_gen/config.py +30 -0
  283. attune/workflows/document_gen/report_formatter.py +162 -0
  284. attune/workflows/document_gen/workflow.py +1426 -0
  285. attune/workflows/document_manager.py +216 -0
  286. attune/workflows/document_manager_README.md +134 -0
  287. attune/workflows/documentation_orchestrator.py +1205 -0
  288. attune/workflows/history.py +510 -0
  289. attune/workflows/keyboard_shortcuts/__init__.py +39 -0
  290. attune/workflows/keyboard_shortcuts/generators.py +391 -0
  291. attune/workflows/keyboard_shortcuts/parsers.py +416 -0
  292. attune/workflows/keyboard_shortcuts/prompts.py +295 -0
  293. attune/workflows/keyboard_shortcuts/schema.py +193 -0
  294. attune/workflows/keyboard_shortcuts/workflow.py +509 -0
  295. attune/workflows/llm_base.py +363 -0
  296. attune/workflows/manage_docs.py +87 -0
  297. attune/workflows/manage_docs_README.md +134 -0
  298. attune/workflows/manage_documentation.py +821 -0
  299. attune/workflows/new_sample_workflow1.py +149 -0
  300. attune/workflows/new_sample_workflow1_README.md +150 -0
  301. attune/workflows/orchestrated_health_check.py +849 -0
  302. attune/workflows/orchestrated_release_prep.py +600 -0
  303. attune/workflows/output.py +413 -0
  304. attune/workflows/perf_audit.py +863 -0
  305. attune/workflows/pr_review.py +762 -0
  306. attune/workflows/progress.py +785 -0
  307. attune/workflows/progress_server.py +322 -0
  308. attune/workflows/progressive/README 2.md +454 -0
  309. attune/workflows/progressive/README.md +454 -0
  310. attune/workflows/progressive/__init__.py +82 -0
  311. attune/workflows/progressive/cli.py +219 -0
  312. attune/workflows/progressive/core.py +488 -0
  313. attune/workflows/progressive/orchestrator.py +723 -0
  314. attune/workflows/progressive/reports.py +520 -0
  315. attune/workflows/progressive/telemetry.py +274 -0
  316. attune/workflows/progressive/test_gen.py +495 -0
  317. attune/workflows/progressive/workflow.py +589 -0
  318. attune/workflows/refactor_plan.py +694 -0
  319. attune/workflows/release_prep.py +895 -0
  320. attune/workflows/release_prep_crew.py +969 -0
  321. attune/workflows/research_synthesis.py +404 -0
  322. attune/workflows/routing.py +168 -0
  323. attune/workflows/secure_release.py +593 -0
  324. attune/workflows/security_adapters.py +297 -0
  325. attune/workflows/security_audit.py +1329 -0
  326. attune/workflows/security_audit_phase3.py +355 -0
  327. attune/workflows/seo_optimization.py +633 -0
  328. attune/workflows/step_config.py +234 -0
  329. attune/workflows/telemetry_mixin.py +269 -0
  330. attune/workflows/test5.py +125 -0
  331. attune/workflows/test5_README.md +158 -0
  332. attune/workflows/test_coverage_boost_crew.py +849 -0
  333. attune/workflows/test_gen/__init__.py +52 -0
  334. attune/workflows/test_gen/ast_analyzer.py +249 -0
  335. attune/workflows/test_gen/config.py +88 -0
  336. attune/workflows/test_gen/data_models.py +38 -0
  337. attune/workflows/test_gen/report_formatter.py +289 -0
  338. attune/workflows/test_gen/test_templates.py +381 -0
  339. attune/workflows/test_gen/workflow.py +655 -0
  340. attune/workflows/test_gen.py +54 -0
  341. attune/workflows/test_gen_behavioral.py +477 -0
  342. attune/workflows/test_gen_parallel.py +341 -0
  343. attune/workflows/test_lifecycle.py +526 -0
  344. attune/workflows/test_maintenance.py +627 -0
  345. attune/workflows/test_maintenance_cli.py +590 -0
  346. attune/workflows/test_maintenance_crew.py +840 -0
  347. attune/workflows/test_runner.py +622 -0
  348. attune/workflows/tier_tracking.py +531 -0
  349. attune/workflows/xml_enhanced_crew.py +285 -0
  350. attune_ai-2.0.0.dist-info/METADATA +1026 -0
  351. attune_ai-2.0.0.dist-info/RECORD +457 -0
  352. attune_ai-2.0.0.dist-info/WHEEL +5 -0
  353. attune_ai-2.0.0.dist-info/entry_points.txt +26 -0
  354. attune_ai-2.0.0.dist-info/licenses/LICENSE +201 -0
  355. attune_ai-2.0.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +101 -0
  356. attune_ai-2.0.0.dist-info/top_level.txt +5 -0
  357. attune_healthcare/__init__.py +13 -0
  358. attune_healthcare/monitors/__init__.py +9 -0
  359. attune_healthcare/monitors/clinical_protocol_monitor.py +315 -0
  360. attune_healthcare/monitors/monitoring/__init__.py +44 -0
  361. attune_healthcare/monitors/monitoring/protocol_checker.py +300 -0
  362. attune_healthcare/monitors/monitoring/protocol_loader.py +214 -0
  363. attune_healthcare/monitors/monitoring/sensor_parsers.py +306 -0
  364. attune_healthcare/monitors/monitoring/trajectory_analyzer.py +389 -0
  365. attune_llm/README.md +553 -0
  366. attune_llm/__init__.py +28 -0
  367. attune_llm/agent_factory/__init__.py +53 -0
  368. attune_llm/agent_factory/adapters/__init__.py +85 -0
  369. attune_llm/agent_factory/adapters/autogen_adapter.py +312 -0
  370. attune_llm/agent_factory/adapters/crewai_adapter.py +483 -0
  371. attune_llm/agent_factory/adapters/haystack_adapter.py +298 -0
  372. attune_llm/agent_factory/adapters/langchain_adapter.py +362 -0
  373. attune_llm/agent_factory/adapters/langgraph_adapter.py +333 -0
  374. attune_llm/agent_factory/adapters/native.py +228 -0
  375. attune_llm/agent_factory/adapters/wizard_adapter.py +423 -0
  376. attune_llm/agent_factory/base.py +305 -0
  377. attune_llm/agent_factory/crews/__init__.py +67 -0
  378. attune_llm/agent_factory/crews/code_review.py +1113 -0
  379. attune_llm/agent_factory/crews/health_check.py +1262 -0
  380. attune_llm/agent_factory/crews/refactoring.py +1128 -0
  381. attune_llm/agent_factory/crews/security_audit.py +1018 -0
  382. attune_llm/agent_factory/decorators.py +287 -0
  383. attune_llm/agent_factory/factory.py +558 -0
  384. attune_llm/agent_factory/framework.py +193 -0
  385. attune_llm/agent_factory/memory_integration.py +328 -0
  386. attune_llm/agent_factory/resilient.py +320 -0
  387. attune_llm/agents_md/__init__.py +22 -0
  388. attune_llm/agents_md/loader.py +218 -0
  389. attune_llm/agents_md/parser.py +271 -0
  390. attune_llm/agents_md/registry.py +307 -0
  391. attune_llm/claude_memory.py +466 -0
  392. attune_llm/cli/__init__.py +8 -0
  393. attune_llm/cli/sync_claude.py +487 -0
  394. attune_llm/code_health.py +1313 -0
  395. attune_llm/commands/__init__.py +51 -0
  396. attune_llm/commands/context.py +375 -0
  397. attune_llm/commands/loader.py +301 -0
  398. attune_llm/commands/models.py +231 -0
  399. attune_llm/commands/parser.py +371 -0
  400. attune_llm/commands/registry.py +429 -0
  401. attune_llm/config/__init__.py +29 -0
  402. attune_llm/config/unified.py +291 -0
  403. attune_llm/context/__init__.py +22 -0
  404. attune_llm/context/compaction.py +455 -0
  405. attune_llm/context/manager.py +434 -0
  406. attune_llm/contextual_patterns.py +361 -0
  407. attune_llm/core.py +907 -0
  408. attune_llm/git_pattern_extractor.py +435 -0
  409. attune_llm/hooks/__init__.py +24 -0
  410. attune_llm/hooks/config.py +306 -0
  411. attune_llm/hooks/executor.py +289 -0
  412. attune_llm/hooks/registry.py +302 -0
  413. attune_llm/hooks/scripts/__init__.py +39 -0
  414. attune_llm/hooks/scripts/evaluate_session.py +201 -0
  415. attune_llm/hooks/scripts/first_time_init.py +285 -0
  416. attune_llm/hooks/scripts/pre_compact.py +207 -0
  417. attune_llm/hooks/scripts/session_end.py +183 -0
  418. attune_llm/hooks/scripts/session_start.py +163 -0
  419. attune_llm/hooks/scripts/suggest_compact.py +225 -0
  420. attune_llm/learning/__init__.py +30 -0
  421. attune_llm/learning/evaluator.py +438 -0
  422. attune_llm/learning/extractor.py +514 -0
  423. attune_llm/learning/storage.py +560 -0
  424. attune_llm/levels.py +227 -0
  425. attune_llm/pattern_confidence.py +414 -0
  426. attune_llm/pattern_resolver.py +272 -0
  427. attune_llm/pattern_summary.py +350 -0
  428. attune_llm/providers.py +967 -0
  429. attune_llm/routing/__init__.py +32 -0
  430. attune_llm/routing/model_router.py +362 -0
  431. attune_llm/security/IMPLEMENTATION_SUMMARY.md +413 -0
  432. attune_llm/security/PHASE2_COMPLETE.md +384 -0
  433. attune_llm/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  434. attune_llm/security/QUICK_REFERENCE.md +316 -0
  435. attune_llm/security/README.md +262 -0
  436. attune_llm/security/__init__.py +62 -0
  437. attune_llm/security/audit_logger.py +929 -0
  438. attune_llm/security/audit_logger_example.py +152 -0
  439. attune_llm/security/pii_scrubber.py +640 -0
  440. attune_llm/security/secrets_detector.py +678 -0
  441. attune_llm/security/secrets_detector_example.py +304 -0
  442. attune_llm/security/secure_memdocs.py +1192 -0
  443. attune_llm/security/secure_memdocs_example.py +278 -0
  444. attune_llm/session_status.py +745 -0
  445. attune_llm/state.py +246 -0
  446. attune_llm/utils/__init__.py +5 -0
  447. attune_llm/utils/tokens.py +349 -0
  448. attune_software/SOFTWARE_PLUGIN_README.md +57 -0
  449. attune_software/__init__.py +13 -0
  450. attune_software/cli/__init__.py +120 -0
  451. attune_software/cli/inspect.py +362 -0
  452. attune_software/cli.py +574 -0
  453. attune_software/plugin.py +188 -0
  454. workflow_scaffolding/__init__.py +11 -0
  455. workflow_scaffolding/__main__.py +12 -0
  456. workflow_scaffolding/cli.py +206 -0
  457. workflow_scaffolding/generator.py +265 -0
attune/templates.py ADDED
@@ -0,0 +1,754 @@
1
+ """Template Starters for Empathy Framework
2
+
3
+ Scaffold new projects with Empathy pre-configured for different use cases.
4
+
5
+ Supported templates:
6
+ - python-fastapi: FastAPI web service with Empathy integration
7
+ - python-cli: Command-line tool with Empathy
8
+ - python-agent: AI agent toolkit project
9
+ - minimal: Minimal Empathy setup (just config files)
10
+
11
+ Copyright 2025 Smart-AI-Memory
12
+ Licensed under Fair Source License 0.9
13
+ """
14
+
15
+ from pathlib import Path
16
+ from typing import Any
17
+
18
+ from attune.config import _validate_file_path
19
+
20
+ # Template definitions
21
+ TEMPLATES: dict[str, dict[str, Any]] = {
22
+ "minimal": {
23
+ "name": "Minimal",
24
+ "description": "Just the Empathy config files - add to existing project",
25
+ "files": {
26
+ "attune.config.yml": """# Empathy Framework Configuration
27
+ # Generated by: empathy new minimal
28
+
29
+ user_id: "{{project_name}}"
30
+ target_level: 4
31
+ confidence_threshold: 0.75
32
+
33
+ # Model routing for cost optimization
34
+ model_routing:
35
+ enabled: true
36
+ provider: "anthropic"
37
+ models:
38
+ cheap: "claude-3-haiku-20240307"
39
+ capable: "claude-sonnet-4-20250514"
40
+ premium: "claude-opus-4-20250514"
41
+
42
+ # Claude Code integration
43
+ claude_sync:
44
+ enabled: true
45
+ output_dir: ".claude/rules/empathy"
46
+
47
+ # Persistence
48
+ persistence_enabled: true
49
+ persistence_backend: "sqlite"
50
+ persistence_path: ".empathy"
51
+ metrics_enabled: true
52
+ """,
53
+ ".claude/CLAUDE.md": """# {{project_name}} - Claude Code Rules
54
+
55
+ ## Project Context
56
+
57
+ This project uses Empathy Framework for AI-assisted development.
58
+
59
+ ## Empathy Integration
60
+
61
+ Run these commands for best results:
62
+ - `empathy morning` - Start-of-day briefing
63
+ - `empathy ship` - Pre-commit checks
64
+ - `empathy sync-claude` - Sync patterns to Claude Code
65
+
66
+ ## Coding Patterns
67
+
68
+ @patterns/debugging.json
69
+ @patterns/security.json
70
+ """,
71
+ ".gitignore_additions": """# Empathy Framework
72
+ .attune/
73
+ patterns/sensitive/
74
+ *.db
75
+ """,
76
+ },
77
+ },
78
+ "python-cli": {
79
+ "name": "Python CLI Tool",
80
+ "description": "Command-line tool with Empathy for smart assistance",
81
+ "files": {
82
+ "attune.config.yml": """# Empathy Framework Configuration
83
+ # Template: python-cli
84
+
85
+ user_id: "{{project_name}}"
86
+ target_level: 4
87
+ confidence_threshold: 0.75
88
+
89
+ model_routing:
90
+ enabled: true
91
+ provider: "anthropic"
92
+ models:
93
+ cheap: "claude-3-haiku-20240307"
94
+ capable: "claude-sonnet-4-20250514"
95
+ premium: "claude-opus-4-20250514"
96
+
97
+ claude_sync:
98
+ enabled: true
99
+ output_dir: ".claude/rules/empathy"
100
+
101
+ persistence_enabled: true
102
+ persistence_backend: "sqlite"
103
+ persistence_path: ".empathy"
104
+ metrics_enabled: true
105
+
106
+ inspection:
107
+ parallel: true
108
+ learning: true
109
+ format: "terminal"
110
+ """,
111
+ "{{project_name}}/__init__.py": '''"""
112
+ {{project_name}} - A CLI tool powered by Empathy Framework
113
+ """
114
+
115
+ __version__ = "0.1.0"
116
+ ''',
117
+ "{{project_name}}/cli.py": '''"""
118
+ Command-line interface for {{project_name}}
119
+ """
120
+
121
+ import argparse
122
+ from attune import EmpathyOS, load_config
123
+
124
+
125
+ def main():
126
+ parser = argparse.ArgumentParser(
127
+ prog="{{project_name}}",
128
+ description="{{project_name}} - powered by Empathy Framework"
129
+ )
130
+ parser.add_argument("--version", action="version", version="%(prog)s 0.1.0")
131
+
132
+ args = parser.parse_args()
133
+
134
+ # Initialize Empathy
135
+ config = load_config()
136
+ empathy = EmpathyOS(config)
137
+
138
+ print("{{project_name}} is ready!")
139
+ print(f"Empathy level: {config.target_level}")
140
+
141
+
142
+ if __name__ == "__main__":
143
+ main()
144
+ ''',
145
+ "pyproject.toml": """[build-system]
146
+ requires = ["hatchling"]
147
+ build-backend = "hatchling.build"
148
+
149
+ [project]
150
+ name = "{{project_name}}"
151
+ version = "0.1.0"
152
+ description = "A CLI tool powered by Empathy Framework"
153
+ readme = "README.md"
154
+ requires-python = ">=3.9"
155
+ dependencies = [
156
+ "empathy-framework>=2.3",
157
+ ]
158
+
159
+ [project.scripts]
160
+ {{project_name}} = "{{project_name}}.cli:main"
161
+ """,
162
+ "README.md": """# {{project_name}}
163
+
164
+ A CLI tool powered by Empathy Framework.
165
+
166
+ ## Installation
167
+
168
+ ```bash
169
+ pip install -e .
170
+ ```
171
+
172
+ ## Usage
173
+
174
+ ```bash
175
+ {{project_name}} --help
176
+ ```
177
+
178
+ ## Development
179
+
180
+ ```bash
181
+ # Start-of-day briefing
182
+ empathy morning
183
+
184
+ # Pre-commit checks
185
+ empathy ship
186
+
187
+ # Sync patterns to Claude Code
188
+ empathy sync-claude
189
+ ```
190
+ """,
191
+ ".claude/CLAUDE.md": """# {{project_name}} - Claude Code Rules
192
+
193
+ ## Project Context
194
+
195
+ CLI tool built with Empathy Framework.
196
+
197
+ ## Key Commands
198
+
199
+ - `empathy morning` - Start-of-day briefing
200
+ - `empathy ship` - Pre-commit checks
201
+ - `empathy learn` - Extract patterns from git history
202
+
203
+ ## Patterns
204
+
205
+ @patterns/debugging.json
206
+ """,
207
+ ".gitignore": """# Python
208
+ __pycache__/
209
+ *.py[cod]
210
+ *.egg-info/
211
+ dist/
212
+ build/
213
+ .eggs/
214
+
215
+ # Empathy Framework
216
+ .attune/
217
+ patterns/sensitive/
218
+
219
+ # IDE
220
+ .vscode/
221
+ .idea/
222
+
223
+ # Environment
224
+ .env
225
+ .venv/
226
+ """,
227
+ },
228
+ },
229
+ "python-fastapi": {
230
+ "name": "Python FastAPI",
231
+ "description": "FastAPI web service with Empathy integration",
232
+ "files": {
233
+ "attune.config.yml": """# Empathy Framework Configuration
234
+ # Template: python-fastapi
235
+
236
+ user_id: "{{project_name}}"
237
+ target_level: 4
238
+ confidence_threshold: 0.75
239
+
240
+ model_routing:
241
+ enabled: true
242
+ provider: "anthropic"
243
+ models:
244
+ cheap: "claude-3-haiku-20240307"
245
+ capable: "claude-sonnet-4-20250514"
246
+ premium: "claude-opus-4-20250514"
247
+
248
+ claude_sync:
249
+ enabled: true
250
+ output_dir: ".claude/rules/empathy"
251
+
252
+ persistence_enabled: true
253
+ persistence_backend: "sqlite"
254
+ persistence_path: ".empathy"
255
+ metrics_enabled: true
256
+
257
+ health:
258
+ checks:
259
+ lint: true
260
+ format: true
261
+ types: true
262
+ security: true
263
+ """,
264
+ "{{project_name}}/__init__.py": '''"""
265
+ {{project_name}} - FastAPI service with Empathy Framework
266
+ """
267
+
268
+ __version__ = "0.1.0"
269
+ ''',
270
+ "{{project_name}}/main.py": '''"""
271
+ FastAPI application for {{project_name}}
272
+ """
273
+
274
+ from fastapi import FastAPI
275
+ from attune import EmpathyOS, load_config
276
+
277
+ app = FastAPI(
278
+ title="{{project_name}}",
279
+ description="FastAPI service powered by Empathy Framework",
280
+ version="0.1.0"
281
+ )
282
+
283
+ # Initialize Empathy (optional - for AI features)
284
+ try:
285
+ config = load_config()
286
+ empathy = EmpathyOS(config)
287
+ except Exception:
288
+ empathy = None
289
+
290
+
291
+ @app.get("/")
292
+ async def root():
293
+ return {
294
+ "message": "Welcome to {{project_name}}",
295
+ "empathy_enabled": empathy is not None
296
+ }
297
+
298
+
299
+ @app.get("/health")
300
+ async def health():
301
+ return {"status": "healthy"}
302
+ ''',
303
+ "pyproject.toml": """[build-system]
304
+ requires = ["hatchling"]
305
+ build-backend = "hatchling.build"
306
+
307
+ [project]
308
+ name = "{{project_name}}"
309
+ version = "0.1.0"
310
+ description = "FastAPI service powered by Empathy Framework"
311
+ readme = "README.md"
312
+ requires-python = ">=3.9"
313
+ dependencies = [
314
+ "fastapi>=0.100",
315
+ "uvicorn[standard]>=0.20",
316
+ "empathy-framework>=2.3",
317
+ ]
318
+
319
+ [project.scripts]
320
+ {{project_name}} = "{{project_name}}.main:app"
321
+ """,
322
+ "README.md": """# {{project_name}}
323
+
324
+ FastAPI service powered by Empathy Framework.
325
+
326
+ ## Installation
327
+
328
+ ```bash
329
+ pip install -e .
330
+ ```
331
+
332
+ ## Running
333
+
334
+ ```bash
335
+ uvicorn {{project_name}}.main:app --reload
336
+ ```
337
+
338
+ ## Development
339
+
340
+ ```bash
341
+ # Start-of-day briefing
342
+ empathy morning
343
+
344
+ # Pre-commit checks
345
+ empathy ship
346
+
347
+ # Run health checks
348
+ empathy health
349
+ ```
350
+
351
+ ## API
352
+
353
+ - `GET /` - Root endpoint
354
+ - `GET /health` - Health check
355
+ """,
356
+ ".claude/CLAUDE.md": """# {{project_name}} - Claude Code Rules
357
+
358
+ ## Project Context
359
+
360
+ FastAPI web service with Empathy Framework integration.
361
+
362
+ ## API Structure
363
+
364
+ - `main.py` - FastAPI app definition
365
+ - Standard RESTful patterns
366
+
367
+ ## Commands
368
+
369
+ - `empathy morning` - Daily briefing
370
+ - `empathy ship` - Pre-commit checks
371
+ - `empathy health` - Code health
372
+
373
+ ## Patterns
374
+
375
+ @patterns/debugging.json
376
+ @patterns/security.json
377
+ """,
378
+ ".gitignore": """# Python
379
+ __pycache__/
380
+ *.py[cod]
381
+ *.egg-info/
382
+ dist/
383
+ build/
384
+
385
+ # Empathy Framework
386
+ .attune/
387
+ patterns/sensitive/
388
+
389
+ # Environment
390
+ .env
391
+ .venv/
392
+
393
+ # IDE
394
+ .vscode/
395
+ .idea/
396
+ """,
397
+ },
398
+ },
399
+ "python-agent": {
400
+ "name": "Python AI Agent",
401
+ "description": "AI agent project with Empathy for pattern learning",
402
+ "files": {
403
+ "attune.config.yml": """# Empathy Framework Configuration
404
+ # Template: python-agent
405
+
406
+ user_id: "{{project_name}}_agent"
407
+ target_level: 5 # Systems thinking for agents
408
+ confidence_threshold: 0.8
409
+
410
+ model_routing:
411
+ enabled: true
412
+ provider: "anthropic"
413
+ models:
414
+ cheap: "claude-3-haiku-20240307"
415
+ capable: "claude-sonnet-4-20250514"
416
+ premium: "claude-opus-4-20250514"
417
+ task_overrides:
418
+ summarize: "cheap"
419
+ classify: "cheap"
420
+ generate_code: "capable"
421
+ architectural_decision: "premium"
422
+ coordinate: "premium"
423
+
424
+ claude_sync:
425
+ enabled: true
426
+ output_dir: ".claude/rules/empathy"
427
+ sync_patterns:
428
+ debugging: true
429
+ security: true
430
+ inspection: true
431
+
432
+ persistence_enabled: true
433
+ persistence_backend: "sqlite"
434
+ persistence_path: ".empathy"
435
+ metrics_enabled: true
436
+
437
+ # Agent-specific settings
438
+ pattern_library_enabled: true
439
+ pattern_sharing: true
440
+ """,
441
+ "{{project_name}}/__init__.py": '''"""
442
+ {{project_name}} - AI Agent powered by Empathy Framework
443
+ """
444
+
445
+ __version__ = "0.1.0"
446
+ ''',
447
+ "{{project_name}}/agent.py": '''"""
448
+ AI Agent implementation for {{project_name}}
449
+ """
450
+
451
+ from attune import EmpathyOS, load_config
452
+ from attune_llm import EmpathyLLM
453
+ import os
454
+
455
+
456
+ class {{project_name_class}}Agent:
457
+ """
458
+ AI Agent with Empathy-powered learning and memory.
459
+ """
460
+
461
+ def __init__(self):
462
+ self.config = load_config()
463
+ self.empathy = EmpathyOS(self.config)
464
+
465
+ # Initialize LLM with model routing
466
+ self.llm = EmpathyLLM(
467
+ provider="anthropic",
468
+ api_key=os.getenv("ANTHROPIC_API_KEY"),
469
+ )
470
+
471
+ async def process(self, user_input: str, context: dict = None) -> str:
472
+ """Process user input and return response."""
473
+ response = await self.llm.interact(
474
+ user_id=self.config.user_id,
475
+ user_input=user_input,
476
+ context=context or {}
477
+ )
478
+ return response.get("response", "")
479
+
480
+ def get_patterns(self) -> list:
481
+ """Get learned patterns."""
482
+ return self.empathy.pattern_library.list_patterns()
483
+
484
+
485
+ async def main():
486
+ """Example usage."""
487
+ agent = {{project_name_class}}Agent()
488
+ response = await agent.process("Hello, what can you help me with?")
489
+ print(response)
490
+
491
+
492
+ if __name__ == "__main__":
493
+ import asyncio
494
+ asyncio.run(main())
495
+ ''',
496
+ "pyproject.toml": """[build-system]
497
+ requires = ["hatchling"]
498
+ build-backend = "hatchling.build"
499
+
500
+ [project]
501
+ name = "{{project_name}}"
502
+ version = "0.1.0"
503
+ description = "AI Agent powered by Empathy Framework"
504
+ readme = "README.md"
505
+ requires-python = ">=3.9"
506
+ dependencies = [
507
+ "empathy-framework>=2.3",
508
+ "anthropic>=0.18",
509
+ ]
510
+
511
+ [project.optional-dependencies]
512
+ dev = [
513
+ "pytest>=7.0",
514
+ "pytest-asyncio>=0.21",
515
+ ]
516
+ """,
517
+ "README.md": """# {{project_name}}
518
+
519
+ AI Agent powered by Empathy Framework with pattern learning.
520
+
521
+ ## Setup
522
+
523
+ 1. Install dependencies:
524
+ ```bash
525
+ pip install -e ".[dev]"
526
+ ```
527
+
528
+ 2. Set API key:
529
+ ```bash
530
+ export ANTHROPIC_API_KEY="your-key"
531
+ ```
532
+
533
+ 3. Run agent:
534
+ ```bash
535
+ python -m {{project_name}}.agent
536
+ ```
537
+
538
+ ## Features
539
+
540
+ - Model routing for cost optimization
541
+ - Pattern learning from interactions
542
+ - Claude Code integration
543
+
544
+ ## Development
545
+
546
+ ```bash
547
+ # Learn patterns from git history
548
+ empathy learn --analyze 50
549
+
550
+ # Sync patterns to Claude Code
551
+ empathy sync-claude
552
+
553
+ # Morning briefing
554
+ empathy morning
555
+ ```
556
+ """,
557
+ ".claude/CLAUDE.md": """# {{project_name}} - AI Agent Rules
558
+
559
+ ## Project Context
560
+
561
+ AI agent with Empathy Framework for pattern learning and memory.
562
+
563
+ ## Agent Architecture
564
+
565
+ - `agent.py` - Main agent class with Empathy integration
566
+ - Model routing: Haiku for simple, Sonnet for code, Opus for decisions
567
+
568
+ ## Pattern Storage
569
+
570
+ Patterns are stored in `patterns/` and synced to Claude Code.
571
+
572
+ @patterns/debugging.json
573
+ @patterns/security.json
574
+ @patterns/inspection.json
575
+ """,
576
+ ".gitignore": """# Python
577
+ __pycache__/
578
+ *.py[cod]
579
+ *.egg-info/
580
+ dist/
581
+ build/
582
+
583
+ # Empathy Framework
584
+ .attune/
585
+ patterns/sensitive/
586
+
587
+ # Environment
588
+ .env
589
+ .venv/
590
+
591
+ # IDE
592
+ .vscode/
593
+ .idea/
594
+ """,
595
+ "tests/__init__.py": "",
596
+ "tests/test_agent.py": '''"""Tests for {{project_name}} agent."""
597
+
598
+ import pytest
599
+ from {{project_name}}.agent import {{project_name_class}}Agent
600
+
601
+
602
+ def test_agent_init():
603
+ """Test agent initialization."""
604
+ # Note: This will require config file
605
+ # agent = {{project_name_class}}Agent()
606
+ # assert agent is not None
607
+ pass
608
+ ''',
609
+ },
610
+ },
611
+ }
612
+
613
+
614
+ def list_templates() -> list:
615
+ """List available templates."""
616
+ return [
617
+ {"id": tid, "name": t["name"], "description": t["description"]}
618
+ for tid, t in TEMPLATES.items()
619
+ ]
620
+
621
+
622
+ def scaffold_project(
623
+ template_name: str,
624
+ project_name: str,
625
+ target_dir: str | None = None,
626
+ force: bool = False,
627
+ ) -> dict:
628
+ """Create a new project from a template.
629
+
630
+ Args:
631
+ template_name: Template ID (minimal, python-cli, python-fastapi, python-agent)
632
+ project_name: Name for the new project
633
+ target_dir: Directory to create project in (default: ./{project_name})
634
+ force: Overwrite existing files
635
+
636
+ Returns:
637
+ Dict with created files and status
638
+
639
+ """
640
+ if template_name not in TEMPLATES:
641
+ return {
642
+ "success": False,
643
+ "error": f"Unknown template: {template_name}",
644
+ "available": list(TEMPLATES.keys()),
645
+ }
646
+
647
+ template = TEMPLATES[template_name]
648
+ target = Path(target_dir) if target_dir else Path(project_name)
649
+
650
+ # Check if directory exists
651
+ if target.exists() and not force:
652
+ if any(target.iterdir()):
653
+ return {
654
+ "success": False,
655
+ "error": f"Directory '{target}' exists and is not empty. Use --force to overwrite.",
656
+ }
657
+
658
+ # Create directory
659
+ target.mkdir(parents=True, exist_ok=True)
660
+
661
+ # Create project name class version (for Python class names)
662
+ project_name_class = "".join(
663
+ word.capitalize() for word in project_name.replace("-", "_").replace(" ", "_").split("_")
664
+ )
665
+
666
+ # Create files
667
+ created_files = []
668
+ files = template["files"]
669
+ if not isinstance(files, dict):
670
+ return {"success": False, "error": "Invalid template structure"}
671
+ for file_path, content in files.items():
672
+ # Replace placeholders in path
673
+ actual_path = file_path.replace("{{project_name}}", project_name)
674
+
675
+ # Replace placeholders in content
676
+ actual_content = content.replace("{{project_name}}", project_name)
677
+ actual_content = actual_content.replace("{{project_name_class}}", project_name_class)
678
+
679
+ # Create file
680
+ full_path = target / actual_path
681
+ full_path.parent.mkdir(parents=True, exist_ok=True)
682
+
683
+ # Handle special files
684
+ if file_path == ".gitignore_additions":
685
+ # Append to existing .gitignore or create new
686
+ gitignore_path = target / ".gitignore"
687
+ validated_gitignore = _validate_file_path(str(gitignore_path))
688
+ if validated_gitignore.exists():
689
+ with open(validated_gitignore, "a") as f:
690
+ f.write("\n" + actual_content)
691
+ else:
692
+ with open(validated_gitignore, "w") as f:
693
+ f.write(actual_content)
694
+ created_files.append(".gitignore")
695
+ else:
696
+ validated_path = _validate_file_path(str(full_path))
697
+ with open(validated_path, "w") as f:
698
+ f.write(actual_content)
699
+ created_files.append(actual_path)
700
+
701
+ # Create patterns directory
702
+ (target / "patterns").mkdir(exist_ok=True)
703
+
704
+ return {
705
+ "success": True,
706
+ "template": template_name,
707
+ "project_name": project_name,
708
+ "target_dir": str(target),
709
+ "files_created": created_files,
710
+ "next_steps": [f"cd {target}", "pip install -e .", "empathy morning"],
711
+ }
712
+
713
+
714
+ def cmd_new(args):
715
+ """CLI command handler for creating new projects."""
716
+ template = getattr(args, "template", None)
717
+ project_name = getattr(args, "name", None)
718
+ target_dir = getattr(args, "output", None)
719
+ force = getattr(args, "force", False)
720
+ list_only = getattr(args, "list", False)
721
+
722
+ if list_only:
723
+ print("\nAvailable Templates:")
724
+ print("-" * 50)
725
+ for t in list_templates():
726
+ print(f" {t['id']:15} {t['description']}")
727
+ print("\nUsage: empathy new <template> <project-name>")
728
+ print()
729
+ return 0
730
+
731
+ if not template or not project_name:
732
+ print("Usage: empathy new <template> <project-name>")
733
+ print(" empathy new --list")
734
+ return 1
735
+
736
+ print(f"\nCreating new project from '{template}' template...")
737
+
738
+ result = scaffold_project(template, project_name, target_dir, force)
739
+
740
+ if result["success"]:
741
+ print(f"\n Project created: {result['target_dir']}")
742
+ print("\n Files created:")
743
+ for f in result["files_created"]:
744
+ print(f" - {f}")
745
+ print("\n Next steps:")
746
+ for step in result["next_steps"]:
747
+ print(f" $ {step}")
748
+ print()
749
+ return 0
750
+ print(f"\n Error: {result['error']}")
751
+ if "available" in result:
752
+ print(f" Available templates: {', '.join(result['available'])}")
753
+ print()
754
+ return 1