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,442 @@
1
+ """CLI Analytics Commands.
2
+
3
+ Analytics Commands for meta-workflow system.
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ from datetime import datetime, timedelta
10
+ from pathlib import Path
11
+
12
+ import typer
13
+ from rich.console import Console
14
+ from rich.panel import Panel
15
+ from rich.table import Table
16
+
17
+ from attune.meta_workflows import (
18
+ PatternLearner,
19
+ list_execution_results,
20
+ load_execution_result,
21
+ )
22
+
23
+ from . import meta_workflow_app
24
+
25
+ console = Console()
26
+
27
+
28
+ @meta_workflow_app.command("analytics")
29
+ def show_analytics(
30
+ template_id: str | None = typer.Argument(
31
+ None,
32
+ help="Template ID to analyze (optional, all if not specified)",
33
+ ),
34
+ min_confidence: float = typer.Option(
35
+ 0.5,
36
+ "--min-confidence",
37
+ "-c",
38
+ help="Minimum confidence threshold (0.0-1.0)",
39
+ ),
40
+ use_memory: bool = typer.Option(
41
+ False,
42
+ "--use-memory",
43
+ "-m",
44
+ help="Use memory-enhanced analytics",
45
+ ),
46
+ ):
47
+ """Show pattern learning analytics and recommendations.
48
+
49
+ Displays:
50
+ - Execution statistics
51
+ - Tier performance insights
52
+ - Cost analysis
53
+ - Recommendations
54
+ """
55
+ try:
56
+ # Initialize pattern learner
57
+ pattern_learner = PatternLearner()
58
+
59
+ if use_memory:
60
+ console.print("[bold]Initializing memory-enhanced analytics...[/bold]\n")
61
+ from attune.memory.unified import UnifiedMemory
62
+
63
+ memory = UnifiedMemory(user_id="cli_analytics")
64
+ pattern_learner = PatternLearner(memory=memory)
65
+
66
+ # Generate report
67
+ report = pattern_learner.generate_analytics_report(template_id=template_id)
68
+
69
+ # Display summary
70
+ summary = report["summary"]
71
+
72
+ console.print("\n[bold cyan]Meta-Workflow Analytics Report[/bold cyan]")
73
+ if template_id:
74
+ console.print(f"[dim]Template: {template_id}[/dim]")
75
+ console.print()
76
+
77
+ summary_table = Table(show_header=False, box=None)
78
+ summary_table.add_column("Metric", style="bold")
79
+ summary_table.add_column("Value")
80
+
81
+ summary_table.add_row("Total Runs", str(summary["total_runs"]))
82
+ summary_table.add_row(
83
+ "Successful", f"{summary['successful_runs']} ({summary['success_rate']:.0%})"
84
+ )
85
+ summary_table.add_row("Total Cost", f"${summary['total_cost']:.2f}")
86
+ summary_table.add_row("Avg Cost/Run", f"${summary['avg_cost_per_run']:.2f}")
87
+ summary_table.add_row("Total Agents", str(summary["total_agents_created"]))
88
+ summary_table.add_row("Avg Agents/Run", f"{summary['avg_agents_per_run']:.1f}")
89
+
90
+ console.print(Panel(summary_table, title="Summary", border_style="cyan"))
91
+
92
+ # Recommendations
93
+ recommendations = report.get("recommendations", [])
94
+ if recommendations:
95
+ console.print("\n[bold]Recommendations:[/bold]\n")
96
+ for rec in recommendations:
97
+ console.print(f" {rec}")
98
+
99
+ # Insights
100
+ insights = report.get("insights", {})
101
+
102
+ if insights.get("tier_performance"):
103
+ console.print("\n[bold]Tier Performance:[/bold]\n")
104
+ for insight in insights["tier_performance"][:5]: # Top 5
105
+ console.print(f" • {insight['description']}")
106
+ console.print(
107
+ f" [dim]Confidence: {insight['confidence']:.0%} (n={insight['sample_size']})[/dim]"
108
+ )
109
+
110
+ if insights.get("cost_analysis"):
111
+ console.print("\n[bold]Cost Analysis:[/bold]\n")
112
+ for insight in insights["cost_analysis"]:
113
+ console.print(f" • {insight['description']}")
114
+
115
+ # Tier breakdown
116
+ breakdown = insight["data"].get("tier_breakdown", {})
117
+ if breakdown:
118
+ console.print("\n [dim]By Tier:[/dim]")
119
+ for tier, stats in breakdown.items():
120
+ console.print(
121
+ f" {tier}: ${stats['avg']:.2f} avg "
122
+ f"(${stats['total']:.2f} total, {stats['count']} runs)"
123
+ )
124
+
125
+ if insights.get("failure_analysis"):
126
+ console.print("\n[bold yellow]Failure Analysis:[/bold yellow]\n")
127
+ for insight in insights["failure_analysis"]:
128
+ console.print(f" ⚠️ {insight['description']}")
129
+
130
+ console.print()
131
+
132
+ except Exception as e:
133
+ console.print(f"[red]Error:[/red] {e}")
134
+ raise typer.Exit(code=1)
135
+
136
+
137
+ # =============================================================================
138
+ # Execution History Commands
139
+ # =============================================================================
140
+
141
+
142
+
143
+ @meta_workflow_app.command("list-runs")
144
+ def list_runs(
145
+ template_id: str | None = typer.Option(
146
+ None,
147
+ "--template",
148
+ "-t",
149
+ help="Filter by template ID",
150
+ ),
151
+ limit: int = typer.Option(
152
+ 10,
153
+ "--limit",
154
+ "-n",
155
+ help="Maximum number of results",
156
+ ),
157
+ ):
158
+ """List execution history.
159
+
160
+ Shows recent workflow executions with:
161
+ - Run ID and timestamp
162
+ - Template name
163
+ - Success status
164
+ - Cost and duration
165
+ """
166
+ try:
167
+ run_ids = list_execution_results()
168
+
169
+ if not run_ids:
170
+ console.print("[yellow]No execution results found.[/yellow]")
171
+ return
172
+
173
+ console.print(
174
+ f"\n[bold]Recent Executions[/bold] (showing {min(limit, len(run_ids))} of {len(run_ids)}):\n"
175
+ )
176
+
177
+ # Create table
178
+ table = Table(show_header=True)
179
+ table.add_column("Run ID", style="cyan")
180
+ table.add_column("Template")
181
+ table.add_column("Status")
182
+ table.add_column("Cost", justify="right")
183
+ table.add_column("Duration", justify="right")
184
+ table.add_column("Timestamp")
185
+
186
+ count = 0
187
+ for run_id in run_ids[:limit]:
188
+ try:
189
+ result = load_execution_result(run_id)
190
+
191
+ # Filter by template if specified
192
+ if template_id and result.template_id != template_id:
193
+ continue
194
+
195
+ status = "✅" if result.success else "❌"
196
+ cost = f"${result.total_cost:.2f}"
197
+ duration = f"{result.total_duration:.1f}s"
198
+
199
+ # Parse timestamp
200
+ try:
201
+ ts = datetime.fromisoformat(result.timestamp)
202
+ timestamp = ts.strftime("%Y-%m-%d %H:%M")
203
+ except Exception:
204
+ timestamp = result.timestamp[:16]
205
+
206
+ table.add_row(
207
+ run_id,
208
+ result.template_id,
209
+ status,
210
+ cost,
211
+ duration,
212
+ timestamp,
213
+ )
214
+
215
+ count += 1
216
+
217
+ except Exception as e:
218
+ console.print(f"[yellow]Warning:[/yellow] Failed to load {run_id}: {e}")
219
+ continue
220
+
221
+ if count == 0:
222
+ if template_id:
223
+ console.print(f"[yellow]No executions found for template: {template_id}[/yellow]")
224
+ else:
225
+ console.print("[yellow]No valid execution results found.[/yellow]")
226
+ return
227
+
228
+ console.print(table)
229
+ console.print("\n[dim]View details: empathy meta-workflow show <run_id>[/dim]\n")
230
+
231
+ except Exception as e:
232
+ console.print(f"[red]Error:[/red] {e}")
233
+ raise typer.Exit(code=1)
234
+
235
+
236
+
237
+ @meta_workflow_app.command("show")
238
+ def show_execution(
239
+ run_id: str = typer.Argument(..., help="Run ID to display"),
240
+ format: str = typer.Option(
241
+ "text",
242
+ "--format",
243
+ "-f",
244
+ help="Output format (text or json)",
245
+ ),
246
+ ):
247
+ """Show detailed execution report.
248
+
249
+ Displays comprehensive information about a specific workflow execution:
250
+ - Form responses
251
+ - Agents created and executed
252
+ - Cost breakdown
253
+ - Success/failure details
254
+ """
255
+ try:
256
+ result = load_execution_result(run_id)
257
+
258
+ if format == "json":
259
+ # JSON output
260
+ print(result.to_json())
261
+ return
262
+
263
+ # Text format (default)
264
+ console.print(f"\n[bold cyan]Execution Report: {run_id}[/bold cyan]\n")
265
+
266
+ # Status
267
+ status = "✅ Success" if result.success else "❌ Failed"
268
+ console.print(f"[bold]Status:[/bold] {status}")
269
+ console.print(f"[bold]Template:[/bold] {result.template_id}")
270
+ console.print(f"[bold]Timestamp:[/bold] {result.timestamp}")
271
+
272
+ if result.error:
273
+ console.print(f"\n[bold red]Error:[/bold red] {result.error}\n")
274
+
275
+ # Summary
276
+ console.print("\n[bold]Summary:[/bold]")
277
+ console.print(f" Agents Created: {len(result.agents_created)}")
278
+ console.print(f" Agents Executed: {len(result.agent_results)}")
279
+ console.print(f" Total Cost: ${result.total_cost:.2f}")
280
+ console.print(f" Duration: {result.total_duration:.1f}s")
281
+
282
+ # Form Responses
283
+ console.print("\n[bold]Form Responses:[/bold]\n")
284
+ for key, value in result.form_responses.responses.items():
285
+ console.print(f" [cyan]{key}:[/cyan] {value}")
286
+
287
+ # Agents
288
+ console.print("\n[bold]Agents Executed:[/bold]\n")
289
+ for i, agent_result in enumerate(result.agent_results, 1):
290
+ status_emoji = "✅" if agent_result.success else "❌"
291
+ console.print(f" {i}. {status_emoji} [cyan]{agent_result.role}[/cyan]")
292
+ console.print(f" Tier: {agent_result.tier_used}")
293
+ console.print(f" Cost: ${agent_result.cost:.2f}")
294
+ console.print(f" Duration: {agent_result.duration:.1f}s")
295
+ if agent_result.error:
296
+ console.print(f" [red]Error: {agent_result.error}[/red]")
297
+ console.print()
298
+
299
+ # Cost breakdown
300
+ console.print("[bold]Cost Breakdown by Tier:[/bold]\n")
301
+ tier_costs = {}
302
+ for agent_result in result.agent_results:
303
+ tier = agent_result.tier_used
304
+ tier_costs[tier] = tier_costs.get(tier, 0.0) + agent_result.cost
305
+
306
+ for tier, cost in sorted(tier_costs.items()):
307
+ console.print(f" {tier}: ${cost:.2f}")
308
+
309
+ console.print()
310
+
311
+ except FileNotFoundError:
312
+ console.print(f"[red]Execution not found:[/red] {run_id}")
313
+ console.print("\n[dim]List available runs: empathy meta-workflow list-runs[/dim]")
314
+ raise typer.Exit(code=1)
315
+ except Exception as e:
316
+ console.print(f"[red]Error:[/red] {e}")
317
+ raise typer.Exit(code=1)
318
+
319
+
320
+ # =============================================================================
321
+ # Maintenance Commands
322
+ # =============================================================================
323
+
324
+
325
+
326
+ @meta_workflow_app.command("cleanup")
327
+ def cleanup_executions(
328
+ older_than_days: int = typer.Option(
329
+ 30,
330
+ "--older-than",
331
+ "-d",
332
+ help="Delete executions older than N days",
333
+ ),
334
+ dry_run: bool = typer.Option(
335
+ False,
336
+ "--dry-run",
337
+ help="Show what would be deleted without deleting",
338
+ ),
339
+ template_id: str | None = typer.Option(
340
+ None,
341
+ "--template",
342
+ "-t",
343
+ help="Filter by template ID",
344
+ ),
345
+ ):
346
+ """Clean up old execution results.
347
+
348
+ Deletes execution directories older than the specified number of days.
349
+ Use --dry-run to preview what would be deleted.
350
+ """
351
+ try:
352
+ cutoff_date = datetime.now() - timedelta(days=older_than_days)
353
+
354
+ run_ids = list_execution_results()
355
+
356
+ if not run_ids:
357
+ console.print("[yellow]No execution results found.[/yellow]")
358
+ return
359
+
360
+ to_delete = []
361
+
362
+ for run_id in run_ids:
363
+ try:
364
+ result = load_execution_result(run_id)
365
+
366
+ # Filter by template if specified
367
+ if template_id and result.template_id != template_id:
368
+ continue
369
+
370
+ # Parse timestamp
371
+ ts = datetime.fromisoformat(result.timestamp)
372
+
373
+ if ts < cutoff_date:
374
+ to_delete.append((run_id, result, ts))
375
+
376
+ except Exception as e:
377
+ console.print(f"[yellow]Warning:[/yellow] Failed to load {run_id}: {e}")
378
+ continue
379
+
380
+ if not to_delete:
381
+ console.print(f"[green]No executions older than {older_than_days} days found.[/green]")
382
+ return
383
+
384
+ # Show what will be deleted
385
+ console.print(f"\n[bold]Executions to delete:[/bold] ({len(to_delete)})\n")
386
+
387
+ table = Table(show_header=True)
388
+ table.add_column("Run ID", style="cyan")
389
+ table.add_column("Template")
390
+ table.add_column("Age (days)", justify="right")
391
+ table.add_column("Cost", justify="right")
392
+
393
+ total_cost_saved = 0.0
394
+ for run_id, result, ts in to_delete:
395
+ age_days = (datetime.now() - ts).days
396
+ table.add_row(
397
+ run_id,
398
+ result.template_id,
399
+ str(age_days),
400
+ f"${result.total_cost:.2f}",
401
+ )
402
+ total_cost_saved += result.total_cost
403
+
404
+ console.print(table)
405
+ console.print(f"\nTotal cost represented: ${total_cost_saved:.2f}")
406
+
407
+ if dry_run:
408
+ console.print("\n[yellow]DRY RUN - No files deleted[/yellow]")
409
+ console.print(f"Run without --dry-run to delete {len(to_delete)} executions")
410
+ return
411
+
412
+ # Confirm deletion
413
+ if not typer.confirm(f"\nDelete {len(to_delete)} execution(s)?"):
414
+ console.print("[yellow]Cancelled[/yellow]")
415
+ return
416
+
417
+ # Delete
418
+ import shutil
419
+
420
+ deleted = 0
421
+ for run_id, _, _ in to_delete:
422
+ try:
423
+ run_dir = Path.home() / ".empathy" / "meta_workflows" / "executions" / run_id
424
+ if run_dir.exists():
425
+ shutil.rmtree(run_dir)
426
+ deleted += 1
427
+ except Exception as e:
428
+ console.print(f"[red]Failed to delete {run_id}:[/red] {e}")
429
+
430
+ console.print(f"\n[green]✓ Deleted {deleted} execution(s)[/green]\n")
431
+
432
+ except Exception as e:
433
+ console.print(f"[red]Error:[/red] {e}")
434
+ raise typer.Exit(code=1)
435
+
436
+
437
+ # =============================================================================
438
+ # Memory Search Commands
439
+ # =============================================================================
440
+
441
+
442
+
@@ -0,0 +1,232 @@
1
+ """CLI Config Commands.
2
+
3
+ Config 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.table import Table
13
+
14
+ from attune.meta_workflows import (
15
+ TemplateRegistry,
16
+ )
17
+
18
+ from . import meta_workflow_app
19
+
20
+ console = Console()
21
+
22
+
23
+ @meta_workflow_app.command("suggest-defaults")
24
+ def suggest_defaults_cmd(
25
+ template_id: str = typer.Argument(..., help="Template ID to get defaults for"),
26
+ session_id: str | None = typer.Option(
27
+ None,
28
+ "--session-id",
29
+ "-s",
30
+ help="Session ID (optional)",
31
+ ),
32
+ user_id: str = typer.Option(
33
+ "cli_user",
34
+ "--user-id",
35
+ "-u",
36
+ help="User ID for session",
37
+ ),
38
+ ):
39
+ """Get suggested default values based on session history.
40
+
41
+ Analyzes recent choices for the specified template and suggests
42
+ intelligent defaults for the next run.
43
+
44
+ Examples:
45
+ empathy meta-workflow suggest-defaults test_creation_management_workflow
46
+ empathy meta-workflow suggest-defaults python_package_publish --session-id sess_123
47
+ """
48
+ try:
49
+ from attune.memory.unified import UnifiedMemory
50
+ from attune.meta_workflows.session_context import SessionContext
51
+
52
+ # Initialize
53
+ memory = UnifiedMemory(user_id=user_id)
54
+ session = SessionContext(memory=memory, session_id=session_id)
55
+
56
+ # Load template
57
+ registry = TemplateRegistry()
58
+ template = registry.load_template(template_id)
59
+ if not template:
60
+ console.print(f"[red]Error:[/red] Template not found: {template_id}")
61
+ raise typer.Exit(code=1)
62
+
63
+ console.print(f"\n[bold]Suggested Defaults for:[/bold] {template.name}")
64
+ console.print(f"[dim]Template ID: {template_id}[/dim]\n")
65
+
66
+ # Get suggestions
67
+ defaults = session.suggest_defaults(
68
+ template_id=template_id,
69
+ form_schema=template.form_schema,
70
+ )
71
+
72
+ if not defaults:
73
+ console.print("[yellow]No suggestions available (no recent history).[/yellow]\n")
74
+ return
75
+
76
+ # Display
77
+ console.print(f"[green]Found {len(defaults)} suggested default(s):[/green]\n")
78
+
79
+ table = Table(show_header=True)
80
+ table.add_column("Question ID", style="cyan")
81
+ table.add_column("Suggested Value")
82
+
83
+ for question_id, value in defaults.items():
84
+ # Find the question to get the display text
85
+ question = next(
86
+ (q for q in template.form_schema.questions if q.id == question_id), None
87
+ )
88
+ question_text = question.text if question else question_id
89
+
90
+ value_str = str(value)
91
+ if isinstance(value, list):
92
+ value_str = ", ".join(str(v) for v in value)
93
+
94
+ table.add_row(question_text, value_str)
95
+
96
+ console.print(table)
97
+ console.print(
98
+ f"\n[dim]Use these defaults by running:[/dim]\n"
99
+ f" empathy meta-workflow run {template_id} --use-defaults\n"
100
+ )
101
+
102
+ except ImportError:
103
+ console.print(
104
+ "[red]Error:[/red] Session context not available. "
105
+ "Ensure memory and session modules are installed."
106
+ )
107
+ raise typer.Exit(code=1)
108
+ except Exception as e:
109
+ console.print(f"[red]Error:[/red] {e}")
110
+ raise typer.Exit(code=1)
111
+
112
+
113
+ # =============================================================================
114
+ # Migration Commands
115
+ # =============================================================================
116
+
117
+
118
+
119
+ @meta_workflow_app.command("migrate")
120
+ def show_migration_guide(
121
+ crew_name: str | None = typer.Argument(
122
+ None,
123
+ help="Specific Crew workflow name (optional)",
124
+ ),
125
+ ):
126
+ """Show migration guide from deprecated Crew workflows.
127
+
128
+ Displays information about migrating from the deprecated Crew-based
129
+ workflows to the new meta-workflow system.
130
+
131
+ Examples:
132
+ empathy meta-workflow migrate
133
+ empathy meta-workflow migrate ReleasePreparationCrew
134
+ """
135
+ # Migration mapping
136
+ CREW_MIGRATION_MAP = {
137
+ "ReleasePreparationCrew": {
138
+ "template_id": "release-prep",
139
+ "old_import": "from attune.workflows.release_prep_crew import ReleasePreparationCrew",
140
+ "old_usage": "crew = ReleasePreparationCrew(project_root='.')\nresult = await crew.execute()",
141
+ "new_usage": "empathy meta-workflow run release-prep",
142
+ },
143
+ "TestCoverageBoostCrew": {
144
+ "template_id": "test-coverage-boost",
145
+ "old_import": "from attune.workflows.test_coverage_boost_crew import TestCoverageBoostCrew",
146
+ "old_usage": "crew = TestCoverageBoostCrew(target_coverage=85.0)\nresult = await crew.execute()",
147
+ "new_usage": "empathy meta-workflow run test-coverage-boost",
148
+ },
149
+ "TestMaintenanceCrew": {
150
+ "template_id": "test-maintenance",
151
+ "old_import": "from attune.workflows.test_maintenance_crew import TestMaintenanceCrew",
152
+ "old_usage": "crew = TestMaintenanceCrew('.')\nresult = await crew.run(mode='full')",
153
+ "new_usage": "empathy meta-workflow run test-maintenance",
154
+ },
155
+ "ManageDocumentationCrew": {
156
+ "template_id": "manage-docs",
157
+ "old_import": "from attune.workflows.manage_documentation import ManageDocumentationCrew",
158
+ "old_usage": "crew = ManageDocumentationCrew()\nresult = await crew.execute(path='./src')",
159
+ "new_usage": "empathy meta-workflow run manage-docs",
160
+ },
161
+ }
162
+
163
+ console.print("\n[bold cyan]🔄 Crew → Meta-Workflow Migration Guide[/bold cyan]\n")
164
+
165
+ if crew_name:
166
+ # Show specific migration
167
+ if crew_name not in CREW_MIGRATION_MAP:
168
+ console.print(f"[red]Unknown Crew workflow:[/red] {crew_name}")
169
+ console.print("\n[bold]Available Crew workflows:[/bold]")
170
+ for name in CREW_MIGRATION_MAP:
171
+ console.print(f" • {name}")
172
+ raise typer.Exit(code=1)
173
+
174
+ info = CREW_MIGRATION_MAP[crew_name]
175
+ console.print(f"[bold]Migrating:[/bold] {crew_name}\n")
176
+
177
+ console.print("[bold red]DEPRECATED (Before):[/bold red]")
178
+ console.print(f"[dim]{info['old_import']}[/dim]")
179
+ console.print(f"\n[yellow]{info['old_usage']}[/yellow]\n")
180
+
181
+ console.print("[bold green]RECOMMENDED (After):[/bold green]")
182
+ console.print(f"[green]{info['new_usage']}[/green]\n")
183
+
184
+ console.print("[bold]Benefits:[/bold]")
185
+ console.print(" ✓ No CrewAI/LangChain dependency required")
186
+ console.print(" ✓ Interactive configuration via Socratic questions")
187
+ console.print(" ✓ Automatic cost optimization with tier escalation")
188
+ console.print(" ✓ Session context for learning preferences")
189
+ console.print(" ✓ Built-in analytics and pattern learning\n")
190
+
191
+ console.print(f"[dim]Try it now: empathy meta-workflow run {info['template_id']}[/dim]\n")
192
+
193
+ else:
194
+ # Show overview
195
+ console.print("[bold]Why Migrate?[/bold]")
196
+ console.print(" The Crew-based workflows are deprecated since v4.3.0.")
197
+ console.print(" The meta-workflow system provides the same functionality")
198
+ console.print(" with better cost optimization and no extra dependencies.\n")
199
+
200
+ # Show migration table
201
+ table = Table(title="Migration Map", show_header=True)
202
+ table.add_column("Deprecated Crew", style="yellow")
203
+ table.add_column("Meta-Workflow Command", style="green")
204
+ table.add_column("Template ID", style="cyan")
205
+
206
+ for crew_name, info in CREW_MIGRATION_MAP.items():
207
+ table.add_row(
208
+ crew_name,
209
+ info["new_usage"],
210
+ info["template_id"],
211
+ )
212
+
213
+ console.print(table)
214
+
215
+ console.print("\n[bold]Quick Start:[/bold]")
216
+ console.print(
217
+ " 1. List available templates: [cyan]empathy meta-workflow list-templates[/cyan]"
218
+ )
219
+ console.print(" 2. Run a workflow: [cyan]empathy meta-workflow run release-prep[/cyan]")
220
+ console.print(" 3. View results: [cyan]empathy meta-workflow list-runs[/cyan]\n")
221
+
222
+ console.print("[bold]More Details:[/bold]")
223
+ console.print(" • Migration guide: [dim]empathy meta-workflow migrate <CrewName>[/dim]")
224
+ console.print(" • Full documentation: [dim]docs/CREWAI_MIGRATION.md[/dim]\n")
225
+
226
+
227
+ # =============================================================================
228
+ # Dynamic Agent/Team Creation Commands (v4.4)
229
+ # =============================================================================
230
+
231
+
232
+