empathy-framework 4.6.6__py3-none-any.whl → 4.7.1__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 (273) hide show
  1. empathy_framework-4.7.1.dist-info/METADATA +690 -0
  2. empathy_framework-4.7.1.dist-info/RECORD +379 -0
  3. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/top_level.txt +1 -2
  4. empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
  5. empathy_llm_toolkit/agent_factory/__init__.py +6 -6
  6. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
  7. empathy_llm_toolkit/agents_md/__init__.py +22 -0
  8. empathy_llm_toolkit/agents_md/loader.py +218 -0
  9. empathy_llm_toolkit/agents_md/parser.py +271 -0
  10. empathy_llm_toolkit/agents_md/registry.py +307 -0
  11. empathy_llm_toolkit/commands/__init__.py +51 -0
  12. empathy_llm_toolkit/commands/context.py +375 -0
  13. empathy_llm_toolkit/commands/loader.py +301 -0
  14. empathy_llm_toolkit/commands/models.py +231 -0
  15. empathy_llm_toolkit/commands/parser.py +371 -0
  16. empathy_llm_toolkit/commands/registry.py +429 -0
  17. empathy_llm_toolkit/config/__init__.py +8 -8
  18. empathy_llm_toolkit/config/unified.py +3 -7
  19. empathy_llm_toolkit/context/__init__.py +22 -0
  20. empathy_llm_toolkit/context/compaction.py +455 -0
  21. empathy_llm_toolkit/context/manager.py +434 -0
  22. empathy_llm_toolkit/hooks/__init__.py +24 -0
  23. empathy_llm_toolkit/hooks/config.py +306 -0
  24. empathy_llm_toolkit/hooks/executor.py +289 -0
  25. empathy_llm_toolkit/hooks/registry.py +302 -0
  26. empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
  27. empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
  28. empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
  29. empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
  30. empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
  31. empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
  32. empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
  33. empathy_llm_toolkit/learning/__init__.py +30 -0
  34. empathy_llm_toolkit/learning/evaluator.py +438 -0
  35. empathy_llm_toolkit/learning/extractor.py +514 -0
  36. empathy_llm_toolkit/learning/storage.py +560 -0
  37. empathy_llm_toolkit/providers.py +4 -11
  38. empathy_llm_toolkit/security/__init__.py +17 -17
  39. empathy_llm_toolkit/utils/tokens.py +2 -5
  40. empathy_os/__init__.py +202 -70
  41. empathy_os/cache_monitor.py +5 -3
  42. empathy_os/cli/__init__.py +11 -55
  43. empathy_os/cli/__main__.py +29 -15
  44. empathy_os/cli/commands/inspection.py +21 -12
  45. empathy_os/cli/commands/memory.py +4 -12
  46. empathy_os/cli/commands/profiling.py +198 -0
  47. empathy_os/cli/commands/utilities.py +27 -7
  48. empathy_os/cli.py +28 -57
  49. empathy_os/cli_unified.py +525 -1164
  50. empathy_os/cost_tracker.py +9 -3
  51. empathy_os/dashboard/server.py +200 -2
  52. empathy_os/hot_reload/__init__.py +7 -7
  53. empathy_os/hot_reload/config.py +6 -7
  54. empathy_os/hot_reload/integration.py +35 -35
  55. empathy_os/hot_reload/reloader.py +57 -57
  56. empathy_os/hot_reload/watcher.py +28 -28
  57. empathy_os/hot_reload/websocket.py +2 -2
  58. empathy_os/memory/__init__.py +11 -4
  59. empathy_os/memory/claude_memory.py +1 -1
  60. empathy_os/memory/cross_session.py +8 -12
  61. empathy_os/memory/edges.py +6 -6
  62. empathy_os/memory/file_session.py +770 -0
  63. empathy_os/memory/graph.py +30 -30
  64. empathy_os/memory/nodes.py +6 -6
  65. empathy_os/memory/short_term.py +15 -9
  66. empathy_os/memory/unified.py +606 -140
  67. empathy_os/meta_workflows/agent_creator.py +3 -9
  68. empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
  69. empathy_os/meta_workflows/form_engine.py +6 -18
  70. empathy_os/meta_workflows/intent_detector.py +64 -24
  71. empathy_os/meta_workflows/models.py +3 -1
  72. empathy_os/meta_workflows/pattern_learner.py +13 -31
  73. empathy_os/meta_workflows/plan_generator.py +55 -47
  74. empathy_os/meta_workflows/session_context.py +2 -3
  75. empathy_os/meta_workflows/workflow.py +20 -51
  76. empathy_os/models/cli.py +2 -2
  77. empathy_os/models/tasks.py +1 -2
  78. empathy_os/models/telemetry.py +4 -1
  79. empathy_os/models/token_estimator.py +3 -1
  80. empathy_os/monitoring/alerts.py +938 -9
  81. empathy_os/monitoring/alerts_cli.py +346 -183
  82. empathy_os/orchestration/execution_strategies.py +12 -29
  83. empathy_os/orchestration/pattern_learner.py +20 -26
  84. empathy_os/orchestration/real_tools.py +6 -15
  85. empathy_os/platform_utils.py +2 -1
  86. empathy_os/plugins/__init__.py +2 -2
  87. empathy_os/plugins/base.py +64 -64
  88. empathy_os/plugins/registry.py +32 -32
  89. empathy_os/project_index/index.py +49 -15
  90. empathy_os/project_index/models.py +1 -2
  91. empathy_os/project_index/reports.py +1 -1
  92. empathy_os/project_index/scanner.py +1 -0
  93. empathy_os/redis_memory.py +10 -7
  94. empathy_os/resilience/__init__.py +1 -1
  95. empathy_os/resilience/health.py +10 -10
  96. empathy_os/routing/__init__.py +7 -7
  97. empathy_os/routing/chain_executor.py +37 -37
  98. empathy_os/routing/classifier.py +36 -36
  99. empathy_os/routing/smart_router.py +40 -40
  100. empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
  101. empathy_os/scaffolding/__init__.py +8 -8
  102. empathy_os/scaffolding/__main__.py +1 -1
  103. empathy_os/scaffolding/cli.py +28 -28
  104. empathy_os/socratic/__init__.py +3 -19
  105. empathy_os/socratic/ab_testing.py +25 -36
  106. empathy_os/socratic/blueprint.py +38 -38
  107. empathy_os/socratic/cli.py +34 -20
  108. empathy_os/socratic/collaboration.py +30 -28
  109. empathy_os/socratic/domain_templates.py +9 -1
  110. empathy_os/socratic/embeddings.py +17 -13
  111. empathy_os/socratic/engine.py +135 -70
  112. empathy_os/socratic/explainer.py +70 -60
  113. empathy_os/socratic/feedback.py +24 -19
  114. empathy_os/socratic/forms.py +15 -10
  115. empathy_os/socratic/generator.py +51 -35
  116. empathy_os/socratic/llm_analyzer.py +25 -23
  117. empathy_os/socratic/mcp_server.py +99 -159
  118. empathy_os/socratic/session.py +19 -13
  119. empathy_os/socratic/storage.py +98 -67
  120. empathy_os/socratic/success.py +38 -27
  121. empathy_os/socratic/visual_editor.py +51 -39
  122. empathy_os/socratic/web_ui.py +99 -66
  123. empathy_os/telemetry/cli.py +3 -1
  124. empathy_os/telemetry/usage_tracker.py +1 -3
  125. empathy_os/test_generator/__init__.py +3 -3
  126. empathy_os/test_generator/cli.py +28 -28
  127. empathy_os/test_generator/generator.py +64 -66
  128. empathy_os/test_generator/risk_analyzer.py +11 -11
  129. empathy_os/vscode_bridge 2.py +173 -0
  130. empathy_os/vscode_bridge.py +173 -0
  131. empathy_os/workflows/__init__.py +212 -120
  132. empathy_os/workflows/batch_processing.py +8 -24
  133. empathy_os/workflows/bug_predict.py +1 -1
  134. empathy_os/workflows/code_review.py +20 -5
  135. empathy_os/workflows/code_review_pipeline.py +13 -8
  136. empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
  137. empathy_os/workflows/manage_documentation.py +1 -0
  138. empathy_os/workflows/orchestrated_health_check.py +6 -11
  139. empathy_os/workflows/orchestrated_release_prep.py +3 -3
  140. empathy_os/workflows/pr_review.py +18 -10
  141. empathy_os/workflows/progressive/README 2.md +454 -0
  142. empathy_os/workflows/progressive/__init__ 2.py +92 -0
  143. empathy_os/workflows/progressive/__init__.py +2 -12
  144. empathy_os/workflows/progressive/cli 2.py +242 -0
  145. empathy_os/workflows/progressive/cli.py +14 -37
  146. empathy_os/workflows/progressive/core 2.py +488 -0
  147. empathy_os/workflows/progressive/core.py +12 -12
  148. empathy_os/workflows/progressive/orchestrator 2.py +701 -0
  149. empathy_os/workflows/progressive/orchestrator.py +166 -144
  150. empathy_os/workflows/progressive/reports 2.py +528 -0
  151. empathy_os/workflows/progressive/reports.py +22 -31
  152. empathy_os/workflows/progressive/telemetry 2.py +280 -0
  153. empathy_os/workflows/progressive/telemetry.py +8 -14
  154. empathy_os/workflows/progressive/test_gen 2.py +514 -0
  155. empathy_os/workflows/progressive/test_gen.py +29 -48
  156. empathy_os/workflows/progressive/workflow 2.py +628 -0
  157. empathy_os/workflows/progressive/workflow.py +31 -70
  158. empathy_os/workflows/release_prep.py +21 -6
  159. empathy_os/workflows/release_prep_crew.py +1 -0
  160. empathy_os/workflows/secure_release.py +13 -6
  161. empathy_os/workflows/security_audit.py +8 -3
  162. empathy_os/workflows/test_coverage_boost_crew.py +3 -2
  163. empathy_os/workflows/test_maintenance_crew.py +1 -0
  164. empathy_os/workflows/test_runner.py +16 -12
  165. empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
  166. empathy_software_plugin/cli.py +0 -122
  167. patterns/README.md +119 -0
  168. patterns/__init__.py +95 -0
  169. patterns/behavior.py +298 -0
  170. patterns/code_review_memory.json +441 -0
  171. patterns/core.py +97 -0
  172. patterns/debugging.json +3763 -0
  173. patterns/empathy.py +268 -0
  174. patterns/health_check_memory.json +505 -0
  175. patterns/input.py +161 -0
  176. patterns/memory_graph.json +8 -0
  177. patterns/refactoring_memory.json +1113 -0
  178. patterns/registry.py +663 -0
  179. patterns/security_memory.json +8 -0
  180. patterns/structural.py +415 -0
  181. patterns/validation.py +194 -0
  182. coach_wizards/__init__.py +0 -45
  183. coach_wizards/accessibility_wizard.py +0 -91
  184. coach_wizards/api_wizard.py +0 -91
  185. coach_wizards/base_wizard.py +0 -209
  186. coach_wizards/cicd_wizard.py +0 -91
  187. coach_wizards/code_reviewer_README.md +0 -60
  188. coach_wizards/code_reviewer_wizard.py +0 -180
  189. coach_wizards/compliance_wizard.py +0 -91
  190. coach_wizards/database_wizard.py +0 -91
  191. coach_wizards/debugging_wizard.py +0 -91
  192. coach_wizards/documentation_wizard.py +0 -91
  193. coach_wizards/generate_wizards.py +0 -347
  194. coach_wizards/localization_wizard.py +0 -173
  195. coach_wizards/migration_wizard.py +0 -91
  196. coach_wizards/monitoring_wizard.py +0 -91
  197. coach_wizards/observability_wizard.py +0 -91
  198. coach_wizards/performance_wizard.py +0 -91
  199. coach_wizards/prompt_engineering_wizard.py +0 -661
  200. coach_wizards/refactoring_wizard.py +0 -91
  201. coach_wizards/scaling_wizard.py +0 -90
  202. coach_wizards/security_wizard.py +0 -92
  203. coach_wizards/testing_wizard.py +0 -91
  204. empathy_framework-4.6.6.dist-info/METADATA +0 -1597
  205. empathy_framework-4.6.6.dist-info/RECORD +0 -410
  206. empathy_llm_toolkit/wizards/__init__.py +0 -43
  207. empathy_llm_toolkit/wizards/base_wizard.py +0 -364
  208. empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
  209. empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
  210. empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
  211. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
  212. empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
  213. empathy_os/wizard_factory_cli.py +0 -170
  214. empathy_software_plugin/wizards/__init__.py +0 -42
  215. empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
  216. empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
  217. empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
  218. empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
  219. empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
  220. empathy_software_plugin/wizards/base_wizard.py +0 -288
  221. empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
  222. empathy_software_plugin/wizards/code_review_wizard.py +0 -604
  223. empathy_software_plugin/wizards/debugging/__init__.py +0 -50
  224. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
  225. empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
  226. empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
  227. empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
  228. empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
  229. empathy_software_plugin/wizards/debugging/verification.py +0 -369
  230. empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
  231. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
  232. empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
  233. empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
  234. empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
  235. empathy_software_plugin/wizards/performance/__init__.py +0 -9
  236. empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
  237. empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
  238. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
  239. empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
  240. empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
  241. empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
  242. empathy_software_plugin/wizards/security/__init__.py +0 -32
  243. empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
  244. empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
  245. empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
  246. empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
  247. empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
  248. empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
  249. empathy_software_plugin/wizards/testing/__init__.py +0 -27
  250. empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
  251. empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
  252. empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
  253. empathy_software_plugin/wizards/testing_wizard.py +0 -274
  254. wizards/__init__.py +0 -82
  255. wizards/admission_assessment_wizard.py +0 -644
  256. wizards/care_plan.py +0 -321
  257. wizards/clinical_assessment.py +0 -769
  258. wizards/discharge_planning.py +0 -77
  259. wizards/discharge_summary_wizard.py +0 -468
  260. wizards/dosage_calculation.py +0 -497
  261. wizards/incident_report_wizard.py +0 -454
  262. wizards/medication_reconciliation.py +0 -85
  263. wizards/nursing_assessment.py +0 -171
  264. wizards/patient_education.py +0 -654
  265. wizards/quality_improvement.py +0 -705
  266. wizards/sbar_report.py +0 -324
  267. wizards/sbar_wizard.py +0 -608
  268. wizards/shift_handoff_wizard.py +0 -535
  269. wizards/soap_note_wizard.py +0 -679
  270. wizards/treatment_plan.py +0 -15
  271. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/WHEEL +0 -0
  272. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/entry_points.txt +0 -0
  273. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/licenses/LICENSE +0 -0
@@ -56,13 +56,9 @@ class DynamicAgentCreator:
56
56
  return []
57
57
 
58
58
  agents = []
59
- self.creation_stats["total_rules_evaluated"] = len(
60
- template.agent_composition_rules
61
- )
59
+ self.creation_stats["total_rules_evaluated"] = len(template.agent_composition_rules)
62
60
 
63
- logger.info(
64
- f"Evaluating {len(template.agent_composition_rules)} composition rules"
65
- )
61
+ logger.info(f"Evaluating {len(template.agent_composition_rules)} composition rules")
66
62
 
67
63
  for rule in template.agent_composition_rules:
68
64
  # Check if agent should be created based on form responses
@@ -77,9 +73,7 @@ class DynamicAgentCreator:
77
73
  )
78
74
  else:
79
75
  self.creation_stats["rules_skipped"] += 1
80
- logger.debug(
81
- f"Skipped agent {rule.role} - conditions not met"
82
- )
76
+ logger.debug(f"Skipped agent {rule.role} - conditions not met")
83
77
 
84
78
  logger.info(
85
79
  f"Created {len(agents)} agents from {len(template.agent_composition_rules)} rules"
@@ -74,7 +74,7 @@ def list_templates(
74
74
  if not template_ids:
75
75
  console.print("[yellow]No templates found.[/yellow]")
76
76
  console.print(f"\nLooking in: {storage_dir}")
77
- console.print("\nCreate templates by running workflow wizard or")
77
+ console.print("\nCreate templates by running workflow workflow or")
78
78
  console.print("placing template JSON files in the templates directory.")
79
79
  return
80
80
 
@@ -83,11 +83,15 @@ def list_templates(
83
83
  user_count = len(template_ids) - builtin_count
84
84
 
85
85
  console.print(f"\n[bold]Available Templates[/bold] ({len(template_ids)} total)")
86
- console.print(f" [cyan]📦 Built-in:[/cyan] {builtin_count} [green]👤 User:[/green] {user_count}\n")
86
+ console.print(
87
+ f" [cyan]📦 Built-in:[/cyan] {builtin_count} [green]👤 User:[/green] {user_count}\n"
88
+ )
87
89
 
88
90
  # Show migration hint for users coming from Crew workflows
89
91
  if builtin_count > 0:
90
- console.print("[dim]💡 Tip: Built-in templates replace deprecated Crew workflows.[/dim]")
92
+ console.print(
93
+ "[dim]💡 Tip: Built-in templates replace deprecated Crew workflows.[/dim]"
94
+ )
91
95
  console.print("[dim] See: empathy meta-workflow migrate --help[/dim]\n")
92
96
 
93
97
  for template_id in template_ids:
@@ -117,9 +121,13 @@ def list_templates(
117
121
 
118
122
  # Add quick start command
119
123
  info_lines.append("")
120
- info_lines.append(f"[bold]Quick Start:[/bold] empathy meta-workflow run {template_id}")
124
+ info_lines.append(
125
+ f"[bold]Quick Start:[/bold] empathy meta-workflow run {template_id}"
126
+ )
121
127
 
122
- console.print(Panel("\n".join(info_lines), border_style="blue" if is_builtin else "green"))
128
+ console.print(
129
+ Panel("\n".join(info_lines), border_style="blue" if is_builtin else "green")
130
+ )
123
131
  console.print()
124
132
 
125
133
  except Exception as e:
@@ -185,7 +193,9 @@ def inspect_template(
185
193
 
186
194
  # Agent Composition Rules (optional)
187
195
  if show_rules:
188
- console.print(f"\n[bold]Agent Composition Rules:[/bold] ({len(template.agent_composition_rules)})\n")
196
+ console.print(
197
+ f"\n[bold]Agent Composition Rules:[/bold] ({len(template.agent_composition_rules)})\n"
198
+ )
189
199
 
190
200
  for i, rule in enumerate(template.agent_composition_rules, 1):
191
201
  rule_lines = [
@@ -208,7 +218,9 @@ def inspect_template(
208
218
  console.print("\n[bold]Summary:[/bold]")
209
219
  console.print(f" Questions: {len(template.form_schema.questions)}")
210
220
  console.print(f" Agent Rules: {len(template.agent_composition_rules)}")
211
- console.print(f" Estimated Cost: ${template.estimated_cost_range[0]:.2f}-${template.estimated_cost_range[1]:.2f}")
221
+ console.print(
222
+ f" Estimated Cost: ${template.estimated_cost_range[0]:.2f}-${template.estimated_cost_range[1]:.2f}"
223
+ )
212
224
  console.print()
213
225
 
214
226
  except Exception as e:
@@ -326,7 +338,9 @@ def generate_plan_cmd(
326
338
 
327
339
  validated_skill_path = _validate_file_path(str(skill_path))
328
340
  validated_skill_path.write_text(plan_content)
329
- console.print(f"\n[green]✓ Installed as Claude Code skill:[/green] {validated_skill_path}")
341
+ console.print(
342
+ f"\n[green]✓ Installed as Claude Code skill:[/green] {validated_skill_path}"
343
+ )
330
344
  console.print(f"\nRun with: [bold]/project:{template_id}[/bold]")
331
345
 
332
346
  elif output_file:
@@ -512,7 +526,9 @@ def run_workflow(
512
526
  if result.error:
513
527
  summary_lines.append(f"\n[bold red]Error:[/bold red] {result.error}")
514
528
 
515
- console.print(Panel("\n".join(summary_lines), title="Execution Summary", border_style="green"))
529
+ console.print(
530
+ Panel("\n".join(summary_lines), title="Execution Summary", border_style="green")
531
+ )
516
532
 
517
533
  # Show agents
518
534
  console.print("\n[bold]Agents Executed:[/bold]\n")
@@ -539,6 +555,7 @@ def run_workflow(
539
555
  else:
540
556
  console.print(f"\n[red]Error:[/red] {e}")
541
557
  import traceback
558
+
542
559
  traceback.print_exc()
543
560
  raise typer.Exit(code=1)
544
561
 
@@ -579,24 +596,32 @@ def natural_language_run(
579
596
  matches = detector.detect(request)
580
597
 
581
598
  if not matches:
582
- console.print("\n[yellow]I couldn't identify a matching agent team for your request.[/yellow]")
599
+ console.print(
600
+ "\n[yellow]I couldn't identify a matching agent team for your request.[/yellow]"
601
+ )
583
602
  console.print("\n[bold]Available agent teams:[/bold]")
584
- console.print(" • [cyan]release-prep[/cyan] - Security, testing, code quality, documentation checks")
585
- console.print(" • [cyan]test-coverage-boost[/cyan] - Analyze and improve test coverage")
603
+ console.print(
604
+ " • [cyan]release-prep[/cyan] - Security, testing, code quality, documentation checks"
605
+ )
606
+ console.print(
607
+ " • [cyan]test-coverage-boost[/cyan] - Analyze and improve test coverage"
608
+ )
586
609
  console.print(" • [cyan]test-maintenance[/cyan] - Test lifecycle management")
587
610
  console.print(" • [cyan]manage-docs[/cyan] - Documentation sync and gap detection")
588
611
  console.print("\n[dim]Try: empathy meta-workflow run <template-id>[/dim]\n")
589
612
  return
590
613
 
591
614
  # Show detected matches
592
- console.print(f"\n[bold]Analyzing:[/bold] \"{request}\"\n")
615
+ console.print(f'\n[bold]Analyzing:[/bold] "{request}"\n')
593
616
 
594
617
  best_match = matches[0]
595
618
  confidence_pct = int(best_match.confidence * 100)
596
619
 
597
620
  # If auto-run and high confidence, run immediately
598
621
  if auto_run and best_match.confidence >= 0.6:
599
- console.print(f"[bold green]Auto-detected:[/bold green] {best_match.template_name} ({confidence_pct}% confidence)")
622
+ console.print(
623
+ f"[bold green]Auto-detected:[/bold green] {best_match.template_name} ({confidence_pct}% confidence)"
624
+ )
600
625
  console.print(f"[dim]{best_match.description}[/dim]\n")
601
626
  console.print(f"[bold]Running {best_match.template_id}...[/bold]\n")
602
627
 
@@ -615,7 +640,11 @@ def natural_language_run(
615
640
 
616
641
  for i, match in enumerate(matches[:3], 1):
617
642
  confidence = int(match.confidence * 100)
618
- style = "green" if match.confidence >= 0.6 else "yellow" if match.confidence >= 0.4 else "dim"
643
+ style = (
644
+ "green"
645
+ if match.confidence >= 0.6
646
+ else "yellow" if match.confidence >= 0.4 else "dim"
647
+ )
619
648
 
620
649
  console.print(f" {i}. [{style}]{match.template_name}[/{style}] ({confidence}% match)")
621
650
  console.print(f" [dim]{match.description}[/dim]")
@@ -627,8 +656,12 @@ def natural_language_run(
627
656
 
628
657
  # Prompt to run best match
629
658
  if best_match.confidence >= 0.5:
630
- console.print("[bold]Quick Run:[/bold] Use [cyan]--auto[/cyan] to automatically run the best match")
631
- console.print(f"[dim]Example: empathy meta-workflow ask \"{request}\" --auto --real[/dim]\n")
659
+ console.print(
660
+ "[bold]Quick Run:[/bold] Use [cyan]--auto[/cyan] to automatically run the best match"
661
+ )
662
+ console.print(
663
+ f'[dim]Example: empathy meta-workflow ask "{request}" --auto --real[/dim]\n'
664
+ )
632
665
 
633
666
  except Exception as e:
634
667
  console.print(f"[red]Error:[/red] {e}")
@@ -657,7 +690,7 @@ def detect_intent(
657
690
  detector = IntentDetector()
658
691
  matches = detector.detect(request, threshold=threshold)
659
692
 
660
- console.print(f"\n[bold]Intent Analysis:[/bold] \"{request}\"\n")
693
+ console.print(f'\n[bold]Intent Analysis:[/bold] "{request}"\n')
661
694
  console.print(f"[dim]Threshold: {threshold:.0%}[/dim]\n")
662
695
 
663
696
  if not matches:
@@ -730,6 +763,7 @@ def show_analytics(
730
763
  if use_memory:
731
764
  console.print("[bold]Initializing memory-enhanced analytics...[/bold]\n")
732
765
  from empathy_os.memory.unified import UnifiedMemory
766
+
733
767
  memory = UnifiedMemory(user_id="cli_analytics")
734
768
  pattern_learner = PatternLearner(memory=memory)
735
769
 
@@ -750,8 +784,7 @@ def show_analytics(
750
784
 
751
785
  summary_table.add_row("Total Runs", str(summary["total_runs"]))
752
786
  summary_table.add_row(
753
- "Successful",
754
- f"{summary['successful_runs']} ({summary['success_rate']:.0%})"
787
+ "Successful", f"{summary['successful_runs']} ({summary['success_rate']:.0%})"
755
788
  )
756
789
  summary_table.add_row("Total Cost", f"${summary['total_cost']:.2f}")
757
790
  summary_table.add_row("Avg Cost/Run", f"${summary['avg_cost_per_run']:.2f}")
@@ -774,7 +807,9 @@ def show_analytics(
774
807
  console.print("\n[bold]Tier Performance:[/bold]\n")
775
808
  for insight in insights["tier_performance"][:5]: # Top 5
776
809
  console.print(f" • {insight['description']}")
777
- console.print(f" [dim]Confidence: {insight['confidence']:.0%} (n={insight['sample_size']})[/dim]")
810
+ console.print(
811
+ f" [dim]Confidence: {insight['confidence']:.0%} (n={insight['sample_size']})[/dim]"
812
+ )
778
813
 
779
814
  if insights.get("cost_analysis"):
780
815
  console.print("\n[bold]Cost Analysis:[/bold]\n")
@@ -782,7 +817,7 @@ def show_analytics(
782
817
  console.print(f" • {insight['description']}")
783
818
 
784
819
  # Tier breakdown
785
- breakdown = insight['data'].get('tier_breakdown', {})
820
+ breakdown = insight["data"].get("tier_breakdown", {})
786
821
  if breakdown:
787
822
  console.print("\n [dim]By Tier:[/dim]")
788
823
  for tier, stats in breakdown.items():
@@ -838,7 +873,9 @@ def list_runs(
838
873
  console.print("[yellow]No execution results found.[/yellow]")
839
874
  return
840
875
 
841
- console.print(f"\n[bold]Recent Executions[/bold] (showing {min(limit, len(run_ids))} of {len(run_ids)}):\n")
876
+ console.print(
877
+ f"\n[bold]Recent Executions[/bold] (showing {min(limit, len(run_ids))} of {len(run_ids)}):\n"
878
+ )
842
879
 
843
880
  # Create table
844
881
  table = Table(show_header=True)
@@ -1042,9 +1079,7 @@ def cleanup_executions(
1042
1079
  continue
1043
1080
 
1044
1081
  if not to_delete:
1045
- console.print(
1046
- f"[green]No executions older than {older_than_days} days found.[/green]"
1047
- )
1082
+ console.print(f"[green]No executions older than {older_than_days} days found.[/green]")
1048
1083
  return
1049
1084
 
1050
1085
  # Show what will be deleted
@@ -1082,6 +1117,7 @@ def cleanup_executions(
1082
1117
 
1083
1118
  # Delete
1084
1119
  import shutil
1120
+
1085
1121
  deleted = 0
1086
1122
  for run_id, _, _ in to_delete:
1087
1123
  try:
@@ -1177,8 +1213,7 @@ def search_memory(
1177
1213
 
1178
1214
  except ImportError:
1179
1215
  console.print(
1180
- "[red]Error:[/red] UnifiedMemory not available. "
1181
- "Ensure memory module is installed."
1216
+ "[red]Error:[/red] UnifiedMemory not available. Ensure memory module is installed."
1182
1217
  )
1183
1218
  raise typer.Exit(code=1)
1184
1219
  except Exception as e:
@@ -1242,10 +1277,7 @@ def show_session_stats(
1242
1277
 
1243
1278
  table.add_row("Total Choices", str(stats.get("choice_count", 0)))
1244
1279
  table.add_row("Templates Used", str(len(stats.get("templates_used", []))))
1245
- table.add_row(
1246
- "Most Recent Choice",
1247
- stats.get("most_recent_choice_timestamp", "N/A")
1248
- )
1280
+ table.add_row("Most Recent Choice", stats.get("most_recent_choice_timestamp", "N/A"))
1249
1281
 
1250
1282
  console.print(table)
1251
1283
  console.print()
@@ -1332,8 +1364,7 @@ def suggest_defaults_cmd(
1332
1364
  for question_id, value in defaults.items():
1333
1365
  # Find the question to get the display text
1334
1366
  question = next(
1335
- (q for q in template.form_schema.questions if q.id == question_id),
1336
- None
1367
+ (q for q in template.form_schema.questions if q.id == question_id), None
1337
1368
  )
1338
1369
  question_text = question.text if question else question_id
1339
1370
 
@@ -1462,7 +1493,9 @@ def show_migration_guide(
1462
1493
  console.print(table)
1463
1494
 
1464
1495
  console.print("\n[bold]Quick Start:[/bold]")
1465
- console.print(" 1. List available templates: [cyan]empathy meta-workflow list-templates[/cyan]")
1496
+ console.print(
1497
+ " 1. List available templates: [cyan]empathy meta-workflow list-templates[/cyan]"
1498
+ )
1466
1499
  console.print(" 2. Run a workflow: [cyan]empathy meta-workflow run release-prep[/cyan]")
1467
1500
  console.print(" 3. View results: [cyan]empathy meta-workflow list-runs[/cyan]\n")
1468
1501
 
@@ -1534,7 +1567,9 @@ def create_agent(
1534
1567
 
1535
1568
  # Question 2: Specific tasks
1536
1569
  console.print("\n[bold]2. What specific tasks will it perform?[/bold]")
1537
- console.print(" [dim]Examples: analyze code, generate tests, review PRs, write docs[/dim]")
1570
+ console.print(
1571
+ " [dim]Examples: analyze code, generate tests, review PRs, write docs[/dim]"
1572
+ )
1538
1573
  tasks = typer.prompt(" List main tasks (comma-separated)")
1539
1574
 
1540
1575
  # Question 3: Tier selection
@@ -1598,7 +1633,9 @@ def create_agent(
1598
1633
 
1599
1634
  # Show usage
1600
1635
  console.print("\n[bold]Next Steps:[/bold]")
1601
- console.print(" 1. Use this agent in a custom team: [cyan]empathy meta-workflow create-team[/cyan]")
1636
+ console.print(
1637
+ " 1. Use this agent in a custom team: [cyan]empathy meta-workflow create-team[/cyan]"
1638
+ )
1602
1639
  console.print(" 2. Or add to an existing template manually")
1603
1640
  console.print(f"\n[dim]Agent tier '{tier}' will cost approximately:")
1604
1641
  costs = {"cheap": "$0.001-0.01", "capable": "$0.01-0.05", "premium": "$0.05-0.20"}
@@ -1662,21 +1699,25 @@ def create_team(
1662
1699
 
1663
1700
  # Question 3: Agent roles
1664
1701
  console.print(f"\n[bold]3. Define {agent_count} agent roles:[/bold]")
1665
- console.print(" [dim]Common roles: analyst, reviewer, generator, validator, reporter[/dim]")
1702
+ console.print(
1703
+ " [dim]Common roles: analyst, reviewer, generator, validator, reporter[/dim]"
1704
+ )
1666
1705
 
1667
1706
  agents = []
1668
1707
  for i in range(agent_count):
1669
- console.print(f"\n [bold]Agent {i+1}:[/bold]")
1708
+ console.print(f"\n [bold]Agent {i + 1}:[/bold]")
1670
1709
  role = typer.prompt(" Role name")
1671
1710
  purpose = typer.prompt(" What does this agent do?")
1672
1711
  tier = typer.prompt(" Tier (cheap/capable/premium)", default="capable")
1673
1712
 
1674
- agents.append({
1675
- "role": role,
1676
- "purpose": purpose,
1677
- "tier": tier,
1678
- "base_template": "generic",
1679
- })
1713
+ agents.append(
1714
+ {
1715
+ "role": role,
1716
+ "purpose": purpose,
1717
+ "tier": tier,
1718
+ "base_template": "generic",
1719
+ }
1720
+ )
1680
1721
 
1681
1722
  # Question 4: Collaboration pattern
1682
1723
  console.print("\n[bold]4. How should agents collaborate?[/bold]")
@@ -1716,9 +1757,24 @@ def create_team(
1716
1757
  "description": goal,
1717
1758
  "collaboration_pattern": "sequential",
1718
1759
  "agents": [
1719
- {"role": "Analyst", "purpose": "Analyze requirements", "tier": "cheap", "base_template": "generic"},
1720
- {"role": "Executor", "purpose": "Perform main task", "tier": "capable", "base_template": "generic"},
1721
- {"role": "Validator", "purpose": "Verify results", "tier": "capable", "base_template": "generic"},
1760
+ {
1761
+ "role": "Analyst",
1762
+ "purpose": "Analyze requirements",
1763
+ "tier": "cheap",
1764
+ "base_template": "generic",
1765
+ },
1766
+ {
1767
+ "role": "Executor",
1768
+ "purpose": "Perform main task",
1769
+ "tier": "capable",
1770
+ "base_template": "generic",
1771
+ },
1772
+ {
1773
+ "role": "Validator",
1774
+ "purpose": "Verify results",
1775
+ "tier": "capable",
1776
+ "base_template": "generic",
1777
+ },
1722
1778
  ],
1723
1779
  "estimated_cost_range": {"min": 0.03, "max": 0.45},
1724
1780
  }
@@ -1737,11 +1793,15 @@ def create_team(
1737
1793
 
1738
1794
  # Show usage
1739
1795
  console.print("\n[bold]Next Steps:[/bold]")
1740
- console.print(f" 1. Save as template: [cyan]--output .empathy/meta_workflows/templates/{team_template['id']}.json[/cyan]")
1741
- console.print(f" 2. Run the team: [cyan]empathy meta-workflow run {team_template['id']}[/cyan]")
1742
-
1743
- cost_min = team_template['estimated_cost_range']['min']
1744
- cost_max = team_template['estimated_cost_range']['max']
1796
+ console.print(
1797
+ f" 1. Save as template: [cyan]--output .empathy/meta_workflows/templates/{team_template['id']}.json[/cyan]"
1798
+ )
1799
+ console.print(
1800
+ f" 2. Run the team: [cyan]empathy meta-workflow run {team_template['id']}[/cyan]"
1801
+ )
1802
+
1803
+ cost_min = team_template["estimated_cost_range"]["min"]
1804
+ cost_max = team_template["estimated_cost_range"]["max"]
1745
1805
  console.print(f"\n[dim]Estimated cost: ${cost_min:.2f} - ${cost_max:.2f} per execution[/dim]\n")
1746
1806
 
1747
1807
 
@@ -63,9 +63,7 @@ class SocraticFormEngine:
63
63
  self._ask_user_callback = ask_user_callback
64
64
  self._use_defaults_when_no_callback = use_defaults_when_no_callback
65
65
 
66
- def ask_questions(
67
- self, form_schema: FormSchema, template_id: str
68
- ) -> FormResponse:
66
+ def ask_questions(self, form_schema: FormSchema, template_id: str) -> FormResponse:
69
67
  """Ask all questions in the form schema and collect responses.
70
68
 
71
69
  Args:
@@ -86,9 +84,7 @@ class SocraticFormEngine:
86
84
  batches = form_schema.get_question_batches(batch_size=4)
87
85
  all_responses = {}
88
86
 
89
- logger.info(
90
- f"Asking {len(form_schema.questions)} questions in {len(batches)} batch(es)"
91
- )
87
+ logger.info(f"Asking {len(form_schema.questions)} questions in {len(batches)} batch(es)")
92
88
 
93
89
  for batch_idx, batch in enumerate(batches, 1):
94
90
  logger.debug(f"Processing batch {batch_idx}/{len(batches)}")
@@ -109,14 +105,10 @@ class SocraticFormEngine:
109
105
  # Cache response
110
106
  self.responses_cache[response.response_id] = response
111
107
 
112
- logger.info(
113
- f"Collected {len(all_responses)} responses for template {template_id}"
114
- )
108
+ logger.info(f"Collected {len(all_responses)} responses for template {template_id}")
115
109
  return response
116
110
 
117
- def _convert_batch_to_ask_user_format(
118
- self, batch: list[FormQuestion]
119
- ) -> list[dict[str, Any]]:
111
+ def _convert_batch_to_ask_user_format(self, batch: list[FormQuestion]) -> list[dict[str, Any]]:
120
112
  """Convert a batch of FormQuestions to AskUserQuestion format.
121
113
 
122
114
  Args:
@@ -127,9 +119,7 @@ class SocraticFormEngine:
127
119
  """
128
120
  return [q.to_ask_user_format() for q in batch]
129
121
 
130
- def _ask_batch(
131
- self, questions: list[dict[str, Any]], template_id: str
132
- ) -> dict[str, Any]:
122
+ def _ask_batch(self, questions: list[dict[str, Any]], template_id: str) -> dict[str, Any]:
133
123
  """Ask a batch of questions using AskUserQuestion tool.
134
124
 
135
125
  Args:
@@ -173,9 +163,7 @@ class SocraticFormEngine:
173
163
  "Either provide a callback or set use_defaults_when_no_callback=True."
174
164
  )
175
165
 
176
- def _get_defaults_from_questions(
177
- self, questions: list[dict[str, Any]]
178
- ) -> dict[str, Any]:
166
+ def _get_defaults_from_questions(self, questions: list[dict[str, Any]]) -> dict[str, Any]:
179
167
  """Extract default values from question definitions.
180
168
 
181
169
  Args:
@@ -39,12 +39,26 @@ class IntentMatch:
39
39
  INTENT_PATTERNS = {
40
40
  "release-prep": {
41
41
  "keywords": [
42
- "release", "deploy", "publish", "ship", "launch",
43
- "ready", "readiness", "checklist", "preparation",
44
- "security scan", "vulnerability", "audit",
45
- "production", "go live", "version bump",
46
- "pre-release", "before release", "quality check",
47
- "code review", "final check"
42
+ "release",
43
+ "deploy",
44
+ "publish",
45
+ "ship",
46
+ "launch",
47
+ "ready",
48
+ "readiness",
49
+ "checklist",
50
+ "preparation",
51
+ "security scan",
52
+ "vulnerability",
53
+ "audit",
54
+ "production",
55
+ "go live",
56
+ "version bump",
57
+ "pre-release",
58
+ "before release",
59
+ "quality check",
60
+ "code review",
61
+ "final check",
48
62
  ],
49
63
  "phrases": [
50
64
  r"ready (for|to) (release|deploy|publish)",
@@ -63,11 +77,23 @@ INTENT_PATTERNS = {
63
77
  },
64
78
  "test-coverage-boost": {
65
79
  "keywords": [
66
- "test coverage", "coverage", "tests", "testing",
67
- "unit tests", "improve coverage", "boost coverage",
68
- "generate tests", "missing tests", "coverage gap",
69
- "80%", "90%", "percent coverage", "more tests",
70
- "add tests", "write tests", "create tests"
80
+ "test coverage",
81
+ "coverage",
82
+ "tests",
83
+ "testing",
84
+ "unit tests",
85
+ "improve coverage",
86
+ "boost coverage",
87
+ "generate tests",
88
+ "missing tests",
89
+ "coverage gap",
90
+ "80%",
91
+ "90%",
92
+ "percent coverage",
93
+ "more tests",
94
+ "add tests",
95
+ "write tests",
96
+ "create tests",
71
97
  ],
72
98
  "phrases": [
73
99
  r"(improve|increase|boost) (test )?coverage",
@@ -83,10 +109,17 @@ INTENT_PATTERNS = {
83
109
  },
84
110
  "test-maintenance": {
85
111
  "keywords": [
86
- "test maintenance", "stale tests", "outdated tests",
87
- "flaky tests", "test health", "test cleanup",
88
- "test lifecycle", "maintain tests", "fix tests",
89
- "broken tests", "failing tests"
112
+ "test maintenance",
113
+ "stale tests",
114
+ "outdated tests",
115
+ "flaky tests",
116
+ "test health",
117
+ "test cleanup",
118
+ "test lifecycle",
119
+ "maintain tests",
120
+ "fix tests",
121
+ "broken tests",
122
+ "failing tests",
90
123
  ],
91
124
  "phrases": [
92
125
  r"(fix|update|maintain) tests",
@@ -101,10 +134,20 @@ INTENT_PATTERNS = {
101
134
  },
102
135
  "manage-docs": {
103
136
  "keywords": [
104
- "documentation", "docs", "docstrings", "readme",
105
- "api docs", "missing docs", "update docs",
106
- "document", "documenting", "undocumented",
107
- "up to date", "sync", "stale docs", "outdated docs"
137
+ "documentation",
138
+ "docs",
139
+ "docstrings",
140
+ "readme",
141
+ "api docs",
142
+ "missing docs",
143
+ "update docs",
144
+ "document",
145
+ "documenting",
146
+ "undocumented",
147
+ "up to date",
148
+ "sync",
149
+ "stale docs",
150
+ "outdated docs",
108
151
  ],
109
152
  "phrases": [
110
153
  r"(update|improve|fix|add) (the )?doc(s|umentation)?",
@@ -227,9 +270,7 @@ class IntentDetector:
227
270
 
228
271
  for i, match in enumerate(matches[:3], 1): # Top 3 suggestions
229
272
  confidence_pct = int(match.confidence * 100)
230
- lines.append(
231
- f" {i}. **{match.template_name}** ({confidence_pct}% match)"
232
- )
273
+ lines.append(f" {i}. **{match.template_name}** ({confidence_pct}% match)")
233
274
  lines.append(f" {match.description}")
234
275
  lines.append(f" Run with: `empathy meta-workflow run {match.template_id}`")
235
276
  lines.append("")
@@ -290,8 +331,7 @@ def auto_detect_template(user_input: str) -> str | None:
290
331
 
291
332
  if match and match.confidence >= 0.6:
292
333
  logger.info(
293
- f"Auto-detected template: {match.template_id} "
294
- f"(confidence: {match.confidence:.0%})"
334
+ f"Auto-detected template: {match.template_id} (confidence: {match.confidence:.0%})"
295
335
  )
296
336
  return match.template_id
297
337
 
@@ -136,7 +136,9 @@ class FormResponse:
136
136
  template_id: str
137
137
  responses: dict[str, Any] = field(default_factory=dict)
138
138
  timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
139
- response_id: str = field(default_factory=lambda: f"resp-{datetime.now().strftime('%Y%m%d-%H%M%S')}")
139
+ response_id: str = field(
140
+ default_factory=lambda: f"resp-{datetime.now().strftime('%Y%m%d-%H%M%S')}"
141
+ )
140
142
 
141
143
  def get(self, question_id: str, default: Any = None) -> Any:
142
144
  """Get response for a question.