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,466 @@
1
+ """Claude Memory Integration Module
2
+
3
+ Reads and integrates Claude Code's CLAUDE.md memory files with the Empathy Framework.
4
+ Supports hierarchical memory loading (Enterprise → Project → User) and @import directives.
5
+
6
+ Example CLAUDE.md structure:
7
+ Enterprise: /etc/claude/CLAUDE.md or env var CLAUDE_ENTERPRISE_MEMORY
8
+ User: ~/.claude/CLAUDE.md
9
+ Project: ./.claude/CLAUDE.md or ./CLAUDE.md
10
+
11
+ Author: Empathy Framework Team
12
+ Version: 1.8.0-alpha
13
+ License: Fair Source 0.9
14
+ """
15
+
16
+ import os
17
+ import re
18
+ from dataclasses import dataclass, field
19
+ from pathlib import Path
20
+
21
+ import structlog
22
+
23
+ logger = structlog.get_logger(__name__)
24
+
25
+
26
+ @dataclass
27
+ class ClaudeMemoryConfig:
28
+ """Configuration for Claude memory integration"""
29
+
30
+ # Enable/disable Claude memory integration
31
+ enabled: bool = False
32
+
33
+ # Memory scope (which levels to load)
34
+ load_enterprise: bool = True
35
+ load_user: bool = True
36
+ load_project: bool = True
37
+
38
+ # Enterprise memory location (optional, from env var or config)
39
+ enterprise_memory_path: str | None = None
40
+
41
+ # Project root (defaults to current working directory)
42
+ project_root: str | None = None
43
+
44
+ # Maximum import depth (prevent infinite loops)
45
+ max_import_depth: int = 5
46
+
47
+ # Maximum file size to read (prevent memory issues)
48
+ max_file_size_bytes: int = 1_000_000 # 1 MB
49
+
50
+ # Validate memory files before using
51
+ validate_files: bool = True
52
+
53
+
54
+ @dataclass
55
+ class MemoryFile:
56
+ """Represents a loaded CLAUDE.md memory file"""
57
+
58
+ level: str # "enterprise", "user", "project"
59
+ path: str
60
+ content: str
61
+ imports: list[str] = field(default_factory=list)
62
+ load_order: int = 0 # Lower numbers load first
63
+
64
+
65
+ class ClaudeMemoryLoader:
66
+ """Loads and manages Claude Code memory files (CLAUDE.md).
67
+
68
+ Follows Claude Code's hierarchical memory system:
69
+ 1. Enterprise memory (organization-wide)
70
+ 2. User memory (personal preferences)
71
+ 3. Project memory (team/project specific)
72
+
73
+ Supports @import directives for modular memory organization.
74
+ """
75
+
76
+ def __init__(self, config: ClaudeMemoryConfig | None = None):
77
+ self.config = config or ClaudeMemoryConfig()
78
+ self._memory_cache: dict[str, MemoryFile] = {}
79
+ self._import_stack: list[str] = [] # Track imports to detect cycles
80
+
81
+ def load_all_memory(self, project_root: str | None = None) -> str:
82
+ """Load all Claude memory files and return combined content.
83
+
84
+ Args:
85
+ project_root: Project root directory (defaults to cwd)
86
+
87
+ Returns:
88
+ Combined memory content from all levels
89
+
90
+ Example:
91
+ loader = ClaudeMemoryLoader(ClaudeMemoryConfig(enabled=True))
92
+ memory = loader.load_all_memory("/path/to/project")
93
+ # Use memory in LLM system prompt
94
+
95
+ """
96
+ if not self.config.enabled:
97
+ logger.debug("claude_memory_disabled")
98
+ return ""
99
+
100
+ project_root = project_root or self.config.project_root or os.getcwd()
101
+ memory_files: list[MemoryFile] = []
102
+
103
+ try:
104
+ # Load in hierarchical order (lower precedence first)
105
+ if self.config.load_enterprise:
106
+ if enterprise_memory := self._load_enterprise_memory():
107
+ enterprise_memory.load_order = 1
108
+ memory_files.append(enterprise_memory)
109
+
110
+ if self.config.load_user:
111
+ if user_memory := self._load_user_memory():
112
+ user_memory.load_order = 2
113
+ memory_files.append(user_memory)
114
+
115
+ if self.config.load_project:
116
+ if project_memory := self._load_project_memory(project_root):
117
+ project_memory.load_order = 3
118
+ memory_files.append(project_memory)
119
+
120
+ # Sort by load order
121
+ memory_files.sort(key=lambda m: m.load_order)
122
+
123
+ # Combine content
124
+ combined = self._combine_memory_files(memory_files)
125
+
126
+ logger.info(
127
+ "claude_memory_loaded",
128
+ files_count=len(memory_files),
129
+ total_chars=len(combined),
130
+ )
131
+
132
+ return combined
133
+
134
+ except Exception as e:
135
+ logger.error("claude_memory_load_failed", error=str(e))
136
+ if self.config.validate_files:
137
+ raise
138
+ return ""
139
+
140
+ def _load_enterprise_memory(self) -> MemoryFile | None:
141
+ """Load enterprise-level memory"""
142
+ # Check environment variable first
143
+ if env_path := os.getenv("CLAUDE_ENTERPRISE_MEMORY"):
144
+ return self._load_memory_file(env_path, "enterprise")
145
+
146
+ # Check config
147
+ if self.config.enterprise_memory_path:
148
+ return self._load_memory_file(self.config.enterprise_memory_path, "enterprise")
149
+
150
+ # Check standard location (Unix-like systems)
151
+ standard_path = Path("/etc/claude/CLAUDE.md")
152
+ if standard_path.exists():
153
+ return self._load_memory_file(str(standard_path), "enterprise")
154
+
155
+ logger.debug("enterprise_memory_not_found")
156
+ return None
157
+
158
+ def _load_user_memory(self) -> MemoryFile | None:
159
+ """Load user-level memory"""
160
+ user_memory_path = Path.home() / ".claude" / "CLAUDE.md"
161
+
162
+ if user_memory_path.exists():
163
+ return self._load_memory_file(str(user_memory_path), "user")
164
+
165
+ logger.debug("user_memory_not_found")
166
+ return None
167
+
168
+ def _load_project_memory(self, project_root: str) -> MemoryFile | None:
169
+ """Load project-level memory"""
170
+ project_path = Path(project_root)
171
+
172
+ # Try .claude/CLAUDE.md first (recommended)
173
+ claude_dir_memory = project_path / ".claude" / "CLAUDE.md"
174
+ if claude_dir_memory.exists():
175
+ return self._load_memory_file(str(claude_dir_memory), "project")
176
+
177
+ # Fallback to CLAUDE.md in project root
178
+ root_memory = project_path / "CLAUDE.md"
179
+ if root_memory.exists():
180
+ return self._load_memory_file(str(root_memory), "project")
181
+
182
+ logger.debug("project_memory_not_found", project_root=project_root)
183
+ return None
184
+
185
+ def _load_memory_file(self, file_path: str, level: str, depth: int = 0) -> MemoryFile | None:
186
+ """Load a single memory file and process imports.
187
+
188
+ Args:
189
+ file_path: Path to CLAUDE.md file
190
+ level: Memory level (enterprise/user/project)
191
+ depth: Current import depth (for recursion control)
192
+
193
+ Returns:
194
+ MemoryFile object or None if failed
195
+
196
+ """
197
+ # Check depth limit
198
+ if depth > self.config.max_import_depth:
199
+ logger.warning(
200
+ "import_depth_exceeded",
201
+ file_path=file_path,
202
+ depth=depth,
203
+ max_depth=self.config.max_import_depth,
204
+ )
205
+ return None
206
+
207
+ # Check for circular imports
208
+ if file_path in self._import_stack:
209
+ logger.warning("circular_import_detected", file_path=file_path)
210
+ return None
211
+
212
+ # Check cache
213
+ if file_path in self._memory_cache:
214
+ return self._memory_cache[file_path]
215
+
216
+ try:
217
+ path = Path(file_path)
218
+
219
+ # Validate file exists
220
+ if not path.exists():
221
+ logger.debug("memory_file_not_found", file_path=file_path)
222
+ return None
223
+
224
+ # Check file size
225
+ file_size = path.stat().st_size
226
+ if file_size > self.config.max_file_size_bytes:
227
+ logger.warning(
228
+ "memory_file_too_large",
229
+ file_path=file_path,
230
+ size_bytes=file_size,
231
+ max_bytes=self.config.max_file_size_bytes,
232
+ )
233
+ return None
234
+
235
+ # Read file
236
+ content = path.read_text(encoding="utf-8")
237
+
238
+ # Process imports
239
+ self._import_stack.append(file_path)
240
+ processed_content, imports = self._process_imports(content, path.parent, depth)
241
+ self._import_stack.pop()
242
+
243
+ # Create memory file object
244
+ memory_file = MemoryFile(
245
+ level=level,
246
+ path=file_path,
247
+ content=processed_content,
248
+ imports=imports,
249
+ )
250
+
251
+ # Cache
252
+ self._memory_cache[file_path] = memory_file
253
+
254
+ logger.debug(
255
+ "memory_file_loaded",
256
+ level=level,
257
+ path=file_path,
258
+ size_chars=len(content),
259
+ imports_count=len(imports),
260
+ )
261
+
262
+ return memory_file
263
+
264
+ except Exception as e:
265
+ logger.error("memory_file_load_error", file_path=file_path, error=str(e))
266
+ if self.config.validate_files:
267
+ raise
268
+ return None
269
+
270
+ def _process_imports(self, content: str, base_dir: Path, depth: int) -> tuple[str, list[str]]:
271
+ """Process @import directives in memory content.
272
+
273
+ Supports syntax: @path/to/file.md
274
+
275
+ Args:
276
+ content: Raw memory file content
277
+ base_dir: Base directory for resolving relative paths
278
+ depth: Current import depth
279
+
280
+ Returns:
281
+ (processed_content, list_of_imported_paths)
282
+
283
+ """
284
+ # Match @import syntax: @path/to/file
285
+ import_pattern = re.compile(r"^@([^\s]+)$", re.MULTILINE)
286
+
287
+ imports: list[str] = []
288
+ processed_lines: list[str] = []
289
+
290
+ for line in content.split("\n"):
291
+ match = import_pattern.match(line.strip())
292
+
293
+ if match:
294
+ import_path = match.group(1)
295
+
296
+ # Resolve path (relative to base_dir)
297
+ resolved_path = (base_dir / import_path).resolve()
298
+
299
+ if resolved_path.exists():
300
+ # Recursively load imported file
301
+ imported_file = self._load_memory_file(
302
+ str(resolved_path),
303
+ level="import",
304
+ depth=depth + 1,
305
+ )
306
+
307
+ if imported_file:
308
+ # Include imported content
309
+ processed_lines.append(f"# Imported from: {import_path}")
310
+ processed_lines.append(imported_file.content)
311
+ imports.append(str(resolved_path))
312
+ else:
313
+ processed_lines.append(f"# Import failed: {import_path}")
314
+ logger.warning("import_failed", import_path=str(resolved_path))
315
+ else:
316
+ processed_lines.append(f"# Import not found: {import_path}")
317
+ logger.warning("import_not_found", import_path=import_path)
318
+ else:
319
+ # Regular line, keep as-is
320
+ processed_lines.append(line)
321
+
322
+ return "\n".join(processed_lines), imports
323
+
324
+ def _combine_memory_files(self, memory_files: list[MemoryFile]) -> str:
325
+ """Combine multiple memory files into a single memory string.
326
+
327
+ Files are combined in load order with clear section markers.
328
+ """
329
+ if not memory_files:
330
+ return ""
331
+
332
+ sections: list[str] = []
333
+
334
+ for memory_file in memory_files:
335
+ section_header = f"""
336
+ ---
337
+ # Claude Memory: {memory_file.level.upper()} Level
338
+ # Source: {memory_file.path}
339
+ ---
340
+ """
341
+ sections.append(section_header)
342
+ sections.append(memory_file.content)
343
+
344
+ return "\n".join(sections)
345
+
346
+ def clear_cache(self):
347
+ """Clear the memory file cache"""
348
+ self._memory_cache.clear()
349
+ logger.debug("memory_cache_cleared")
350
+
351
+ def get_loaded_files(self) -> list[str]:
352
+ """Get list of all loaded memory file paths"""
353
+ return list(self._memory_cache.keys())
354
+
355
+
356
+ def create_default_project_memory(project_root: str, framework: str = "empathy"):
357
+ """Create a default .claude/CLAUDE.md file for a project.
358
+
359
+ Args:
360
+ project_root: Project root directory
361
+ framework: Framework name (e.g., "empathy", "langchain")
362
+
363
+ Example:
364
+ create_default_project_memory("/path/to/project")
365
+
366
+ """
367
+ project_path = Path(project_root)
368
+ claude_dir = project_path / ".claude"
369
+ memory_file = claude_dir / "CLAUDE.md"
370
+
371
+ # Create .claude directory if it doesn't exist
372
+ claude_dir.mkdir(exist_ok=True)
373
+
374
+ # Don't overwrite existing file
375
+ if memory_file.exists():
376
+ logger.info("project_memory_exists", path=str(memory_file))
377
+ return
378
+
379
+ # Create default content
380
+ if framework.lower() == "empathy":
381
+ default_content = """# Project Memory: Empathy Framework
382
+
383
+ ## Project Context
384
+ This project uses the Empathy Framework for AI-powered software development assistance.
385
+
386
+ ## Code Style Preferences
387
+ - Follow PEP 8 for Python code
388
+ - Use type hints for all function signatures
389
+ - Prefer descriptive variable names over comments
390
+ - Maximum line length: 100 characters
391
+
392
+ ## Architecture Patterns
393
+ - Use async/await for I/O operations
394
+ - Implement Level 4 Anticipatory predictions where applicable
395
+ - Store patterns in MemDocs for cross-domain learning
396
+ - Follow the 5-level empathy maturity model
397
+
398
+ ## Security Requirements
399
+ - Never commit API keys or secrets
400
+ - Always validate user input
401
+ - Use parameterized queries (no SQL injection)
402
+ - Implement proper error handling
403
+
404
+ ## Testing Standards
405
+ - Maintain 90%+ test coverage
406
+ - Write tests for all wizards
407
+ - Use pytest fixtures for common setup
408
+ - Mock external API calls
409
+
410
+ ## Documentation
411
+ - Document all public APIs
412
+ - Include usage examples
413
+ - Keep README.md up to date
414
+ - Use docstrings for all classes and functions
415
+
416
+ ## Privacy & Compliance
417
+ - PII must be scrubbed before external API calls
418
+ - Audit log all external requests
419
+ - Follow GDPR/HIPAA requirements
420
+ - Use local-only mode for sensitive code
421
+
422
+ ---
423
+ Generated by Empathy Framework v1.8.0
424
+ """
425
+ else:
426
+ default_content = """# Project Memory
427
+
428
+ ## Project Context
429
+ Add project-specific instructions here.
430
+
431
+ ## Code Preferences
432
+ - Add your coding style preferences
433
+
434
+ ## Architecture
435
+ - Document key architectural decisions
436
+
437
+ ## Security
438
+ - List security requirements
439
+
440
+ ## Testing
441
+ - Define testing standards
442
+
443
+ ---
444
+ Add @imports to include shared memory files:
445
+ @../shared-standards.md
446
+ """
447
+
448
+ # Write file
449
+ memory_file.write_text(default_content, encoding="utf-8")
450
+ logger.info("project_memory_created", path=str(memory_file))
451
+
452
+
453
+ # Example usage:
454
+ if __name__ == "__main__":
455
+ # Example 1: Basic usage
456
+ config = ClaudeMemoryConfig(enabled=True)
457
+ loader = ClaudeMemoryLoader(config)
458
+ memory = loader.load_all_memory()
459
+ print(f"Loaded memory ({len(memory)} chars):")
460
+ print(memory[:500] if memory else "No memory found")
461
+
462
+ # Example 2: Create default project memory
463
+ # create_default_project_memory(".", framework="empathy")
464
+
465
+ # Example 3: Get loaded files
466
+ print(f"\nLoaded files: {loader.get_loaded_files()}")
@@ -0,0 +1,8 @@
1
+ """Empathy Framework CLI Tools
2
+
3
+ Commands:
4
+ - empathy sync-claude: Sync patterns to .claude/rules/empathy/
5
+
6
+ Copyright 2025 Smart AI Memory, LLC
7
+ Licensed under Fair Source 0.9
8
+ """