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,182 @@
1
+ """CLI Memory Commands.
2
+
3
+ Memory Commands for meta-workflow system.
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+
10
+ import typer
11
+ from rich.console import Console
12
+ from rich.panel import Panel
13
+ from rich.table import Table
14
+
15
+ from . import meta_workflow_app
16
+
17
+ console = Console()
18
+
19
+
20
+ @meta_workflow_app.command("search-memory")
21
+ def search_memory(
22
+ query: str = typer.Argument(..., help="Search query for patterns"),
23
+ pattern_type: str | None = typer.Option(
24
+ None,
25
+ "--type",
26
+ "-t",
27
+ help="Filter by pattern type (e.g., 'meta_workflow_execution')",
28
+ ),
29
+ limit: int = typer.Option(
30
+ 10,
31
+ "--limit",
32
+ "-l",
33
+ help="Maximum number of results to return",
34
+ ),
35
+ user_id: str = typer.Option(
36
+ "cli_user",
37
+ "--user-id",
38
+ "-u",
39
+ help="User ID for memory access",
40
+ ),
41
+ ):
42
+ """Search memory for patterns using keyword matching.
43
+
44
+ Searches long-term memory for patterns matching the query.
45
+ Uses relevance scoring: exact phrase (10 pts), keyword in content (2 pts),
46
+ keyword in metadata (1 pt).
47
+
48
+ Examples:
49
+ empathy meta-workflow search-memory "successful workflow"
50
+ empathy meta-workflow search-memory "test coverage" --type meta_workflow_execution
51
+ empathy meta-workflow search-memory "error" --limit 20
52
+ """
53
+ try:
54
+ from attune.memory.unified import UnifiedMemory
55
+
56
+ console.print(f"\n[bold]Searching memory for:[/bold] '{query}'")
57
+ if pattern_type:
58
+ console.print(f"[dim]Pattern type: {pattern_type}[/dim]")
59
+ console.print()
60
+
61
+ # Initialize memory
62
+ memory = UnifiedMemory(user_id=user_id)
63
+
64
+ # Search
65
+ results = memory.search_patterns(
66
+ query=query,
67
+ pattern_type=pattern_type,
68
+ limit=limit,
69
+ )
70
+
71
+ if not results:
72
+ console.print("[yellow]No matching patterns found.[/yellow]\n")
73
+ return
74
+
75
+ # Display results
76
+ console.print(f"[green]Found {len(results)} matching pattern(s):[/green]\n")
77
+
78
+ for i, pattern in enumerate(results, 1):
79
+ panel = Panel(
80
+ f"[bold]Pattern ID:[/bold] {pattern.get('pattern_id', 'N/A')}\n"
81
+ f"[bold]Type:[/bold] {pattern.get('pattern_type', 'N/A')}\n"
82
+ f"[bold]Classification:[/bold] {pattern.get('classification', 'N/A')}\n\n"
83
+ f"[bold]Content:[/bold]\n{str(pattern.get('content', 'N/A'))[:200]}...\n\n"
84
+ f"[bold]Metadata:[/bold] {pattern.get('metadata', {})}",
85
+ title=f"Result {i}/{len(results)}",
86
+ border_style="blue",
87
+ )
88
+ console.print(panel)
89
+ console.print()
90
+
91
+ except ImportError:
92
+ console.print(
93
+ "[red]Error:[/red] UnifiedMemory not available. Ensure memory module is installed."
94
+ )
95
+ raise typer.Exit(code=1)
96
+ except Exception as e:
97
+ console.print(f"[red]Error:[/red] {e}")
98
+ raise typer.Exit(code=1)
99
+
100
+
101
+ # =============================================================================
102
+ # Session Context Commands
103
+ # =============================================================================
104
+
105
+
106
+
107
+ @meta_workflow_app.command("session-stats")
108
+ def show_session_stats(
109
+ session_id: str | None = typer.Option(
110
+ None,
111
+ "--session-id",
112
+ "-s",
113
+ help="Session ID (optional, creates new if not specified)",
114
+ ),
115
+ user_id: str = typer.Option(
116
+ "cli_user",
117
+ "--user-id",
118
+ "-u",
119
+ help="User ID for session",
120
+ ),
121
+ ):
122
+ """Show session context statistics.
123
+
124
+ Displays information about user's session including:
125
+ - Recent form choices
126
+ - Templates used
127
+ - Choice counts
128
+
129
+ Examples:
130
+ empathy meta-workflow session-stats
131
+ empathy meta-workflow session-stats --session-id sess_123
132
+ """
133
+ try:
134
+ from attune.memory.unified import UnifiedMemory
135
+ from attune.meta_workflows.session_context import SessionContext
136
+
137
+ # Initialize memory and session
138
+ memory = UnifiedMemory(user_id=user_id)
139
+ session = SessionContext(
140
+ memory=memory,
141
+ session_id=session_id,
142
+ )
143
+
144
+ console.print("\n[bold]Session Statistics[/bold]")
145
+ console.print(f"[dim]Session ID: {session.session_id}[/dim]")
146
+ console.print(f"[dim]User ID: {session.user_id}[/dim]\n")
147
+
148
+ # Get stats
149
+ stats = session.get_session_stats()
150
+
151
+ # Display
152
+ table = Table(show_header=True)
153
+ table.add_column("Metric", style="cyan")
154
+ table.add_column("Value")
155
+
156
+ table.add_row("Total Choices", str(stats.get("choice_count", 0)))
157
+ table.add_row("Templates Used", str(len(stats.get("templates_used", []))))
158
+ table.add_row("Most Recent Choice", stats.get("most_recent_choice_timestamp", "N/A"))
159
+
160
+ console.print(table)
161
+ console.print()
162
+
163
+ # Show templates used
164
+ templates = stats.get("templates_used", [])
165
+ if templates:
166
+ console.print("[bold]Templates Used:[/bold]")
167
+ for template_id in templates:
168
+ console.print(f" • {template_id}")
169
+ console.print()
170
+
171
+ except ImportError:
172
+ console.print(
173
+ "[red]Error:[/red] Session context not available. "
174
+ "Ensure memory and session modules are installed."
175
+ )
176
+ raise typer.Exit(code=1)
177
+ except Exception as e:
178
+ console.print(f"[red]Error:[/red] {e}")
179
+ raise typer.Exit(code=1)
180
+
181
+
182
+
@@ -0,0 +1,354 @@
1
+ """CLI Template Commands.
2
+
3
+ Template Commands for meta-workflow system.
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ from pathlib import Path
10
+
11
+ import typer
12
+ from rich.console import Console
13
+ from rich.panel import Panel
14
+ from rich.tree import Tree
15
+
16
+ from attune.config import _validate_file_path
17
+ from attune.meta_workflows import (
18
+ TemplateRegistry,
19
+ )
20
+
21
+ from . import meta_workflow_app
22
+
23
+ console = Console()
24
+
25
+
26
+ @meta_workflow_app.command("list-templates")
27
+ def list_templates(
28
+ storage_dir: str = typer.Option(
29
+ ".attune/meta_workflows/templates",
30
+ "--storage-dir",
31
+ "-d",
32
+ help="Templates storage directory",
33
+ ),
34
+ ):
35
+ """List all available workflow templates.
36
+
37
+ Shows template metadata including:
38
+ - Template ID and name
39
+ - Description
40
+ - Estimated cost range
41
+ - Number of questions and agent rules
42
+ """
43
+ try:
44
+ registry = TemplateRegistry(storage_dir=storage_dir)
45
+ template_ids = registry.list_templates()
46
+
47
+ if not template_ids:
48
+ console.print("[yellow]No templates found.[/yellow]")
49
+ console.print(f"\nLooking in: {storage_dir}")
50
+ console.print("\nCreate templates by running workflow workflow or")
51
+ console.print("placing template JSON files in the templates directory.")
52
+ return
53
+
54
+ # Count built-in vs user templates
55
+ builtin_count = sum(1 for t in template_ids if registry.is_builtin(t))
56
+ user_count = len(template_ids) - builtin_count
57
+
58
+ console.print(f"\n[bold]Available Templates[/bold] ({len(template_ids)} total)")
59
+ console.print(
60
+ f" [cyan]📦 Built-in:[/cyan] {builtin_count} [green]👤 User:[/green] {user_count}\n"
61
+ )
62
+
63
+ # Show migration hint for users coming from Crew workflows
64
+ if builtin_count > 0:
65
+ console.print(
66
+ "[dim]💡 Tip: Built-in templates replace deprecated Crew workflows.[/dim]"
67
+ )
68
+ console.print("[dim] See: empathy meta-workflow migrate --help[/dim]\n")
69
+
70
+ for template_id in template_ids:
71
+ template = registry.load_template(template_id)
72
+
73
+ if template:
74
+ # Add badge for built-in templates
75
+ is_builtin = registry.is_builtin(template_id)
76
+ badge = "[cyan]📦 BUILT-IN[/cyan]" if is_builtin else "[green]👤 USER[/green]"
77
+
78
+ # Create info panel
79
+ info_lines = [
80
+ f"[bold]{template.name}[/bold] {badge}",
81
+ f"[dim]{template.description}[/dim]",
82
+ "",
83
+ f"ID: {template.template_id}",
84
+ f"Version: {template.version}",
85
+ f"Author: {template.author}",
86
+ f"Tags: {', '.join(template.tags)}",
87
+ "",
88
+ f"Questions: {len(template.form_schema.questions)}",
89
+ f"Agent Rules: {len(template.agent_composition_rules)}",
90
+ "",
91
+ f"Est. Cost: ${template.estimated_cost_range[0]:.2f}-${template.estimated_cost_range[1]:.2f}",
92
+ f"Est. Duration: ~{template.estimated_duration_minutes} min",
93
+ ]
94
+
95
+ # Add quick start command
96
+ info_lines.append("")
97
+ info_lines.append(
98
+ f"[bold]Quick Start:[/bold] empathy meta-workflow run {template_id}"
99
+ )
100
+
101
+ console.print(
102
+ Panel("\n".join(info_lines), border_style="blue" if is_builtin else "green")
103
+ )
104
+ console.print()
105
+
106
+ except Exception as e:
107
+ console.print(f"[red]Error:[/red] {e}")
108
+ raise typer.Exit(code=1)
109
+
110
+
111
+
112
+ @meta_workflow_app.command("inspect")
113
+ def inspect_template(
114
+ template_id: str = typer.Argument(..., help="Template ID to inspect"),
115
+ storage_dir: str = typer.Option(
116
+ ".attune/meta_workflows/templates",
117
+ "--storage-dir",
118
+ "-d",
119
+ help="Templates storage directory",
120
+ ),
121
+ show_rules: bool = typer.Option(
122
+ False,
123
+ "--show-rules",
124
+ "-r",
125
+ help="Show agent composition rules",
126
+ ),
127
+ ):
128
+ """Inspect a specific template in detail.
129
+
130
+ Shows comprehensive template information including:
131
+ - Form questions and types
132
+ - Agent composition rules (optional)
133
+ - Configuration mappings
134
+ """
135
+ try:
136
+ registry = TemplateRegistry(storage_dir=storage_dir)
137
+ template = registry.load_template(template_id)
138
+
139
+ if not template:
140
+ console.print(f"[red]Template not found:[/red] {template_id}")
141
+ raise typer.Exit(code=1)
142
+
143
+ # Header
144
+ console.print(f"\n[bold cyan]Template: {template.name}[/bold cyan]")
145
+ console.print(f"[dim]{template.description}[/dim]\n")
146
+
147
+ # Form Schema
148
+ console.print("[bold]Form Questions:[/bold]")
149
+ form_tree = Tree("📋 Questions")
150
+
151
+ for i, question in enumerate(template.form_schema.questions, 1):
152
+ question_text = f"[cyan]{question.text}[/cyan]"
153
+ q_node = form_tree.add(f"{i}. {question_text}")
154
+ q_node.add(f"ID: {question.id}")
155
+ q_node.add(f"Type: {question.type.value}")
156
+ if question.options:
157
+ options_str = ", ".join(question.options[:3])
158
+ if len(question.options) > 3:
159
+ options_str += f", ... ({len(question.options) - 3} more)"
160
+ q_node.add(f"Options: {options_str}")
161
+ if question.required:
162
+ q_node.add("[yellow]Required[/yellow]")
163
+ if question.default:
164
+ q_node.add(f"Default: {question.default}")
165
+
166
+ console.print(form_tree)
167
+
168
+ # Agent Composition Rules (optional)
169
+ if show_rules:
170
+ console.print(
171
+ f"\n[bold]Agent Composition Rules:[/bold] ({len(template.agent_composition_rules)})\n"
172
+ )
173
+
174
+ for i, rule in enumerate(template.agent_composition_rules, 1):
175
+ rule_lines = [
176
+ f"[bold cyan]{i}. {rule.role}[/bold cyan]",
177
+ f" Base Template: {rule.base_template}",
178
+ f" Tier Strategy: {rule.tier_strategy.value}",
179
+ f" Tools: {', '.join(rule.tools) if rule.tools else 'None'}",
180
+ ]
181
+
182
+ if rule.required_responses:
183
+ rule_lines.append(f" Required When: {rule.required_responses}")
184
+
185
+ if rule.config_mapping:
186
+ rule_lines.append(f" Config Mapping: {len(rule.config_mapping)} fields")
187
+
188
+ console.print("\n".join(rule_lines))
189
+ console.print()
190
+
191
+ # Summary
192
+ console.print("\n[bold]Summary:[/bold]")
193
+ console.print(f" Questions: {len(template.form_schema.questions)}")
194
+ console.print(f" Agent Rules: {len(template.agent_composition_rules)}")
195
+ console.print(
196
+ f" Estimated Cost: ${template.estimated_cost_range[0]:.2f}-${template.estimated_cost_range[1]:.2f}"
197
+ )
198
+ console.print()
199
+
200
+ except Exception as e:
201
+ console.print(f"[red]Error:[/red] {e}")
202
+ raise typer.Exit(code=1)
203
+
204
+
205
+ # =============================================================================
206
+ # Plan Generation Commands (Claude Code Integration)
207
+ # =============================================================================
208
+
209
+
210
+
211
+ @meta_workflow_app.command("plan")
212
+ def generate_plan_cmd(
213
+ template_id: str = typer.Argument(..., help="Template ID to generate plan for"),
214
+ output_format: str = typer.Option(
215
+ "markdown",
216
+ "--format",
217
+ "-f",
218
+ help="Output format: markdown, skill, or json",
219
+ ),
220
+ output_file: str = typer.Option(
221
+ None,
222
+ "--output",
223
+ "-o",
224
+ help="Output file path (default: stdout)",
225
+ ),
226
+ use_defaults: bool = typer.Option(
227
+ True,
228
+ "--use-defaults/--interactive",
229
+ help="Use default values or ask interactively",
230
+ ),
231
+ install_skill: bool = typer.Option(
232
+ False,
233
+ "--install",
234
+ "-i",
235
+ help="Install as Claude Code skill in .claude/commands/",
236
+ ),
237
+ ):
238
+ """Generate execution plan for Claude Code (no API costs).
239
+
240
+ This generates a plan that can be executed by Claude Code using your
241
+ Max subscription instead of making API calls.
242
+
243
+ Output formats:
244
+ - markdown: Human-readable plan to paste into Claude Code
245
+ - skill: Claude Code skill format for .claude/commands/
246
+ - json: Structured format for programmatic use
247
+
248
+ Examples:
249
+ empathy meta-workflow plan release-prep
250
+ empathy meta-workflow plan release-prep --format skill --install
251
+ empathy meta-workflow plan test-coverage-boost -o plan.md
252
+ empathy meta-workflow plan manage-docs --format json
253
+ """
254
+ try:
255
+ from attune.meta_workflows.plan_generator import generate_plan
256
+
257
+ # Load template
258
+ console.print(f"\n[bold]Generating plan for:[/bold] {template_id}")
259
+ registry = TemplateRegistry()
260
+ template = registry.load_template(template_id)
261
+
262
+ if not template:
263
+ console.print(f"[red]Template not found:[/red] {template_id}")
264
+ raise typer.Exit(code=1)
265
+
266
+ # Collect responses if interactive
267
+ form_responses = None
268
+ if not use_defaults and template.form_schema.questions:
269
+ console.print("\n[bold]Configuration:[/bold]")
270
+ form_responses = {}
271
+ for question in template.form_schema.questions:
272
+ if question.options:
273
+ # Multiple choice
274
+ console.print(f"\n{question.text}")
275
+ for i, opt in enumerate(question.options, 1):
276
+ default_mark = " (default)" if opt == question.default else ""
277
+ console.print(f" {i}. {opt}{default_mark}")
278
+ choice = typer.prompt("Choice", default="1")
279
+ try:
280
+ idx = int(choice) - 1
281
+ form_responses[question.id] = question.options[idx]
282
+ except (ValueError, IndexError):
283
+ form_responses[question.id] = question.default or question.options[0]
284
+ else:
285
+ # Yes/No or text
286
+ default = question.default or "Yes"
287
+ response = typer.prompt(question.text, default=default)
288
+ form_responses[question.id] = response
289
+
290
+ # Generate plan
291
+ plan_content = generate_plan(
292
+ template_id=template_id,
293
+ form_responses=form_responses,
294
+ use_defaults=use_defaults,
295
+ output_format=output_format,
296
+ )
297
+
298
+ # Handle output
299
+ if install_skill:
300
+ # Install as Claude Code skill
301
+ skill_dir = Path(".claude/commands")
302
+ skill_dir.mkdir(parents=True, exist_ok=True)
303
+ skill_path = skill_dir / f"{template_id}.md"
304
+
305
+ # Convert to skill format if not already
306
+ if output_format != "skill":
307
+ plan_content = generate_plan(
308
+ template_id=template_id,
309
+ form_responses=form_responses,
310
+ use_defaults=use_defaults,
311
+ output_format="skill",
312
+ )
313
+
314
+ validated_skill_path = _validate_file_path(str(skill_path))
315
+ validated_skill_path.write_text(plan_content)
316
+ console.print(
317
+ f"\n[green]✓ Installed as Claude Code skill:[/green] {validated_skill_path}"
318
+ )
319
+ console.print(f"\nRun with: [bold]/project:{template_id}[/bold]")
320
+
321
+ elif output_file:
322
+ # Write to file
323
+ validated_output = _validate_file_path(output_file)
324
+ validated_output.write_text(plan_content)
325
+ console.print(f"\n[green]✓ Plan saved to:[/green] {validated_output}")
326
+
327
+ else:
328
+ # Print to stdout
329
+ console.print("\n" + "=" * 60)
330
+ console.print(plan_content)
331
+ console.print("=" * 60)
332
+
333
+ # Show usage hints
334
+ console.print("\n[bold]Usage Options:[/bold]")
335
+ console.print("1. Copy prompts into Claude Code conversation")
336
+ console.print("2. Install as skill with: --install")
337
+ console.print("3. Use with Claude Code Task tool")
338
+ console.print("\n[dim]Cost: $0 (uses your Max subscription)[/dim]")
339
+
340
+ except ImportError:
341
+ console.print("[red]Plan generator not available.[/red]")
342
+ console.print("This feature requires the plan_generator module.")
343
+ raise typer.Exit(code=1)
344
+ except Exception as e:
345
+ console.print(f"[red]Error generating plan:[/red] {e}")
346
+ raise typer.Exit(code=1)
347
+
348
+
349
+ # =============================================================================
350
+ # Execution Commands
351
+ # =============================================================================
352
+
353
+
354
+