empathy-framework 3.2.3__py3-none-any.whl → 3.8.2__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 (328) hide show
  1. coach_wizards/__init__.py +11 -12
  2. coach_wizards/accessibility_wizard.py +12 -12
  3. coach_wizards/api_wizard.py +12 -12
  4. coach_wizards/base_wizard.py +26 -20
  5. coach_wizards/cicd_wizard.py +15 -13
  6. coach_wizards/code_reviewer_README.md +60 -0
  7. coach_wizards/code_reviewer_wizard.py +180 -0
  8. coach_wizards/compliance_wizard.py +12 -12
  9. coach_wizards/database_wizard.py +12 -12
  10. coach_wizards/debugging_wizard.py +12 -12
  11. coach_wizards/documentation_wizard.py +12 -12
  12. coach_wizards/generate_wizards.py +1 -2
  13. coach_wizards/localization_wizard.py +101 -19
  14. coach_wizards/migration_wizard.py +12 -12
  15. coach_wizards/monitoring_wizard.py +12 -12
  16. coach_wizards/observability_wizard.py +12 -12
  17. coach_wizards/performance_wizard.py +12 -12
  18. coach_wizards/prompt_engineering_wizard.py +22 -25
  19. coach_wizards/refactoring_wizard.py +12 -12
  20. coach_wizards/scaling_wizard.py +12 -12
  21. coach_wizards/security_wizard.py +12 -12
  22. coach_wizards/testing_wizard.py +12 -12
  23. {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/METADATA +513 -58
  24. empathy_framework-3.8.2.dist-info/RECORD +333 -0
  25. empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
  26. {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/top_level.txt +5 -1
  27. empathy_healthcare_plugin/__init__.py +1 -2
  28. empathy_healthcare_plugin/monitors/__init__.py +9 -0
  29. empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
  30. empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
  31. empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
  32. empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
  33. empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
  34. empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
  35. empathy_llm_toolkit/__init__.py +7 -7
  36. empathy_llm_toolkit/agent_factory/__init__.py +53 -0
  37. empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
  38. empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
  39. empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
  40. empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
  41. empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
  42. empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
  43. empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
  44. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
  45. empathy_llm_toolkit/agent_factory/base.py +305 -0
  46. empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
  47. empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
  48. empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
  49. empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
  50. empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
  51. empathy_llm_toolkit/agent_factory/decorators.py +286 -0
  52. empathy_llm_toolkit/agent_factory/factory.py +558 -0
  53. empathy_llm_toolkit/agent_factory/framework.py +192 -0
  54. empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
  55. empathy_llm_toolkit/agent_factory/resilient.py +320 -0
  56. empathy_llm_toolkit/claude_memory.py +14 -15
  57. empathy_llm_toolkit/cli/__init__.py +8 -0
  58. empathy_llm_toolkit/cli/sync_claude.py +487 -0
  59. empathy_llm_toolkit/code_health.py +177 -22
  60. empathy_llm_toolkit/config/__init__.py +29 -0
  61. empathy_llm_toolkit/config/unified.py +295 -0
  62. empathy_llm_toolkit/contextual_patterns.py +11 -12
  63. empathy_llm_toolkit/core.py +51 -49
  64. empathy_llm_toolkit/git_pattern_extractor.py +16 -12
  65. empathy_llm_toolkit/levels.py +6 -13
  66. empathy_llm_toolkit/pattern_confidence.py +14 -18
  67. empathy_llm_toolkit/pattern_resolver.py +10 -12
  68. empathy_llm_toolkit/pattern_summary.py +13 -11
  69. empathy_llm_toolkit/providers.py +194 -28
  70. empathy_llm_toolkit/routing/__init__.py +32 -0
  71. empathy_llm_toolkit/routing/model_router.py +362 -0
  72. empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
  73. empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
  74. empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  75. empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
  76. empathy_llm_toolkit/security/README.md +262 -0
  77. empathy_llm_toolkit/security/__init__.py +62 -0
  78. empathy_llm_toolkit/security/audit_logger.py +929 -0
  79. empathy_llm_toolkit/security/audit_logger_example.py +152 -0
  80. empathy_llm_toolkit/security/pii_scrubber.py +640 -0
  81. empathy_llm_toolkit/security/secrets_detector.py +678 -0
  82. empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
  83. empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
  84. empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
  85. empathy_llm_toolkit/session_status.py +18 -20
  86. empathy_llm_toolkit/state.py +20 -21
  87. empathy_llm_toolkit/wizards/__init__.py +38 -0
  88. empathy_llm_toolkit/wizards/base_wizard.py +364 -0
  89. empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
  90. empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
  91. empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
  92. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
  93. empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
  94. empathy_os/__init__.py +76 -77
  95. empathy_os/adaptive/__init__.py +13 -0
  96. empathy_os/adaptive/task_complexity.py +127 -0
  97. empathy_os/{monitoring.py → agent_monitoring.py} +27 -27
  98. empathy_os/cache/__init__.py +117 -0
  99. empathy_os/cache/base.py +166 -0
  100. empathy_os/cache/dependency_manager.py +253 -0
  101. empathy_os/cache/hash_only.py +248 -0
  102. empathy_os/cache/hybrid.py +390 -0
  103. empathy_os/cache/storage.py +282 -0
  104. empathy_os/cli.py +515 -109
  105. empathy_os/cli_unified.py +189 -42
  106. empathy_os/config/__init__.py +63 -0
  107. empathy_os/config/xml_config.py +239 -0
  108. empathy_os/config.py +87 -36
  109. empathy_os/coordination.py +48 -54
  110. empathy_os/core.py +90 -99
  111. empathy_os/cost_tracker.py +20 -23
  112. empathy_os/dashboard/__init__.py +15 -0
  113. empathy_os/dashboard/server.py +743 -0
  114. empathy_os/discovery.py +9 -11
  115. empathy_os/emergence.py +20 -21
  116. empathy_os/exceptions.py +18 -30
  117. empathy_os/feedback_loops.py +27 -30
  118. empathy_os/levels.py +31 -34
  119. empathy_os/leverage_points.py +27 -28
  120. empathy_os/logging_config.py +11 -12
  121. empathy_os/memory/__init__.py +195 -0
  122. empathy_os/memory/claude_memory.py +466 -0
  123. empathy_os/memory/config.py +224 -0
  124. empathy_os/memory/control_panel.py +1298 -0
  125. empathy_os/memory/edges.py +179 -0
  126. empathy_os/memory/graph.py +567 -0
  127. empathy_os/memory/long_term.py +1194 -0
  128. empathy_os/memory/nodes.py +179 -0
  129. empathy_os/memory/redis_bootstrap.py +540 -0
  130. empathy_os/memory/security/__init__.py +31 -0
  131. empathy_os/memory/security/audit_logger.py +930 -0
  132. empathy_os/memory/security/pii_scrubber.py +640 -0
  133. empathy_os/memory/security/secrets_detector.py +678 -0
  134. empathy_os/memory/short_term.py +2119 -0
  135. empathy_os/memory/storage/__init__.py +15 -0
  136. empathy_os/memory/summary_index.py +583 -0
  137. empathy_os/memory/unified.py +619 -0
  138. empathy_os/metrics/__init__.py +12 -0
  139. empathy_os/metrics/prompt_metrics.py +190 -0
  140. empathy_os/models/__init__.py +136 -0
  141. empathy_os/models/__main__.py +13 -0
  142. empathy_os/models/cli.py +655 -0
  143. empathy_os/models/empathy_executor.py +354 -0
  144. empathy_os/models/executor.py +252 -0
  145. empathy_os/models/fallback.py +671 -0
  146. empathy_os/models/provider_config.py +563 -0
  147. empathy_os/models/registry.py +382 -0
  148. empathy_os/models/tasks.py +302 -0
  149. empathy_os/models/telemetry.py +548 -0
  150. empathy_os/models/token_estimator.py +378 -0
  151. empathy_os/models/validation.py +274 -0
  152. empathy_os/monitoring/__init__.py +52 -0
  153. empathy_os/monitoring/alerts.py +23 -0
  154. empathy_os/monitoring/alerts_cli.py +268 -0
  155. empathy_os/monitoring/multi_backend.py +271 -0
  156. empathy_os/monitoring/otel_backend.py +363 -0
  157. empathy_os/optimization/__init__.py +19 -0
  158. empathy_os/optimization/context_optimizer.py +272 -0
  159. empathy_os/pattern_library.py +29 -28
  160. empathy_os/persistence.py +30 -34
  161. empathy_os/platform_utils.py +261 -0
  162. empathy_os/plugins/__init__.py +28 -0
  163. empathy_os/plugins/base.py +361 -0
  164. empathy_os/plugins/registry.py +268 -0
  165. empathy_os/project_index/__init__.py +30 -0
  166. empathy_os/project_index/cli.py +335 -0
  167. empathy_os/project_index/crew_integration.py +430 -0
  168. empathy_os/project_index/index.py +425 -0
  169. empathy_os/project_index/models.py +501 -0
  170. empathy_os/project_index/reports.py +473 -0
  171. empathy_os/project_index/scanner.py +538 -0
  172. empathy_os/prompts/__init__.py +61 -0
  173. empathy_os/prompts/config.py +77 -0
  174. empathy_os/prompts/context.py +177 -0
  175. empathy_os/prompts/parser.py +285 -0
  176. empathy_os/prompts/registry.py +313 -0
  177. empathy_os/prompts/templates.py +208 -0
  178. empathy_os/redis_config.py +144 -58
  179. empathy_os/redis_memory.py +53 -56
  180. empathy_os/resilience/__init__.py +56 -0
  181. empathy_os/resilience/circuit_breaker.py +256 -0
  182. empathy_os/resilience/fallback.py +179 -0
  183. empathy_os/resilience/health.py +300 -0
  184. empathy_os/resilience/retry.py +209 -0
  185. empathy_os/resilience/timeout.py +135 -0
  186. empathy_os/routing/__init__.py +43 -0
  187. empathy_os/routing/chain_executor.py +433 -0
  188. empathy_os/routing/classifier.py +217 -0
  189. empathy_os/routing/smart_router.py +234 -0
  190. empathy_os/routing/wizard_registry.py +307 -0
  191. empathy_os/templates.py +12 -11
  192. empathy_os/trust/__init__.py +28 -0
  193. empathy_os/trust/circuit_breaker.py +579 -0
  194. empathy_os/trust_building.py +44 -36
  195. empathy_os/validation/__init__.py +19 -0
  196. empathy_os/validation/xml_validator.py +281 -0
  197. empathy_os/wizard_factory_cli.py +170 -0
  198. empathy_os/{workflows.py → workflow_commands.py} +123 -31
  199. empathy_os/workflows/__init__.py +360 -0
  200. empathy_os/workflows/base.py +1660 -0
  201. empathy_os/workflows/bug_predict.py +962 -0
  202. empathy_os/workflows/code_review.py +960 -0
  203. empathy_os/workflows/code_review_adapters.py +310 -0
  204. empathy_os/workflows/code_review_pipeline.py +720 -0
  205. empathy_os/workflows/config.py +600 -0
  206. empathy_os/workflows/dependency_check.py +648 -0
  207. empathy_os/workflows/document_gen.py +1069 -0
  208. empathy_os/workflows/documentation_orchestrator.py +1205 -0
  209. empathy_os/workflows/health_check.py +679 -0
  210. empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
  211. empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
  212. empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
  213. empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
  214. empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
  215. empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
  216. empathy_os/workflows/manage_documentation.py +804 -0
  217. empathy_os/workflows/new_sample_workflow1.py +146 -0
  218. empathy_os/workflows/new_sample_workflow1_README.md +150 -0
  219. empathy_os/workflows/perf_audit.py +687 -0
  220. empathy_os/workflows/pr_review.py +748 -0
  221. empathy_os/workflows/progress.py +445 -0
  222. empathy_os/workflows/progress_server.py +322 -0
  223. empathy_os/workflows/refactor_plan.py +693 -0
  224. empathy_os/workflows/release_prep.py +808 -0
  225. empathy_os/workflows/research_synthesis.py +404 -0
  226. empathy_os/workflows/secure_release.py +585 -0
  227. empathy_os/workflows/security_adapters.py +297 -0
  228. empathy_os/workflows/security_audit.py +1046 -0
  229. empathy_os/workflows/step_config.py +234 -0
  230. empathy_os/workflows/test5.py +125 -0
  231. empathy_os/workflows/test5_README.md +158 -0
  232. empathy_os/workflows/test_gen.py +1855 -0
  233. empathy_os/workflows/test_lifecycle.py +526 -0
  234. empathy_os/workflows/test_maintenance.py +626 -0
  235. empathy_os/workflows/test_maintenance_cli.py +590 -0
  236. empathy_os/workflows/test_maintenance_crew.py +821 -0
  237. empathy_os/workflows/xml_enhanced_crew.py +285 -0
  238. empathy_software_plugin/__init__.py +1 -2
  239. empathy_software_plugin/cli/__init__.py +120 -0
  240. empathy_software_plugin/cli/inspect.py +362 -0
  241. empathy_software_plugin/cli.py +35 -26
  242. empathy_software_plugin/plugin.py +4 -8
  243. empathy_software_plugin/wizards/__init__.py +42 -0
  244. empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
  245. empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
  246. empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
  247. empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
  248. empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
  249. empathy_software_plugin/wizards/base_wizard.py +288 -0
  250. empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
  251. empathy_software_plugin/wizards/code_review_wizard.py +606 -0
  252. empathy_software_plugin/wizards/debugging/__init__.py +50 -0
  253. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
  254. empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
  255. empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
  256. empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
  257. empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
  258. empathy_software_plugin/wizards/debugging/verification.py +369 -0
  259. empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
  260. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
  261. empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
  262. empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
  263. empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
  264. empathy_software_plugin/wizards/performance/__init__.py +9 -0
  265. empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
  266. empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
  267. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
  268. empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
  269. empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
  270. empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
  271. empathy_software_plugin/wizards/security/__init__.py +32 -0
  272. empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
  273. empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
  274. empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
  275. empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
  276. empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
  277. empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
  278. empathy_software_plugin/wizards/testing/__init__.py +27 -0
  279. empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
  280. empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
  281. empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
  282. empathy_software_plugin/wizards/testing_wizard.py +274 -0
  283. hot_reload/README.md +473 -0
  284. hot_reload/__init__.py +62 -0
  285. hot_reload/config.py +84 -0
  286. hot_reload/integration.py +228 -0
  287. hot_reload/reloader.py +298 -0
  288. hot_reload/watcher.py +179 -0
  289. hot_reload/websocket.py +176 -0
  290. scaffolding/README.md +589 -0
  291. scaffolding/__init__.py +35 -0
  292. scaffolding/__main__.py +14 -0
  293. scaffolding/cli.py +240 -0
  294. test_generator/__init__.py +38 -0
  295. test_generator/__main__.py +14 -0
  296. test_generator/cli.py +226 -0
  297. test_generator/generator.py +325 -0
  298. test_generator/risk_analyzer.py +216 -0
  299. workflow_patterns/__init__.py +33 -0
  300. workflow_patterns/behavior.py +249 -0
  301. workflow_patterns/core.py +76 -0
  302. workflow_patterns/output.py +99 -0
  303. workflow_patterns/registry.py +255 -0
  304. workflow_patterns/structural.py +288 -0
  305. workflow_scaffolding/__init__.py +11 -0
  306. workflow_scaffolding/__main__.py +12 -0
  307. workflow_scaffolding/cli.py +206 -0
  308. workflow_scaffolding/generator.py +265 -0
  309. agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
  310. agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
  311. agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
  312. agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
  313. agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
  314. agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
  315. agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
  316. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
  317. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
  318. agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
  319. agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
  320. agents/compliance_anticipation_agent.py +0 -1427
  321. agents/epic_integration_wizard.py +0 -541
  322. agents/trust_building_behaviors.py +0 -891
  323. empathy_framework-3.2.3.dist-info/RECORD +0 -104
  324. empathy_framework-3.2.3.dist-info/entry_points.txt +0 -7
  325. empathy_llm_toolkit/htmlcov/status.json +0 -1
  326. empathy_llm_toolkit/security/htmlcov/status.json +0 -1
  327. {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
  328. {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,4 @@
1
- """
2
- One-Command Workflows for Empathy Framework
1
+ """One-Command Workflows for Empathy Framework
3
2
 
4
3
  Power-user commands that automate common developer workflows:
5
4
  - morning: Start-of-day briefing with patterns, debt, and focus areas
@@ -30,7 +29,7 @@ def _load_patterns(patterns_dir: str = "./patterns") -> dict[str, list]:
30
29
  if not patterns_path.exists():
31
30
  return patterns
32
31
 
33
- for pattern_type in patterns.keys():
32
+ for pattern_type in patterns:
34
33
  file_path = patterns_path / f"{pattern_type}.json"
35
34
  if file_path.exists():
36
35
  try:
@@ -68,7 +67,7 @@ def _save_stats(stats: dict, empathy_dir: str = ".empathy") -> None:
68
67
  def _run_command(cmd: list, capture: bool = True) -> tuple:
69
68
  """Run a shell command and return (success, output)."""
70
69
  try:
71
- result = subprocess.run(cmd, capture_output=capture, text=True, timeout=300)
70
+ result = subprocess.run(cmd, check=False, capture_output=capture, text=True, timeout=300)
72
71
  return result.returncode == 0, result.stdout + result.stderr
73
72
  except subprocess.TimeoutExpired:
74
73
  return False, "Command timed out"
@@ -97,19 +96,19 @@ def _get_tech_debt_trend(patterns_dir: str = "./patterns") -> str:
97
96
 
98
97
  if recent > previous:
99
98
  return "increasing"
100
- elif recent < previous:
99
+ if recent < previous:
101
100
  return "decreasing"
102
- else:
103
- return "stable"
101
+ return "stable"
104
102
  except (OSError, json.JSONDecodeError, KeyError):
105
103
  return "unknown"
106
104
 
107
105
 
108
106
  def morning_workflow(
109
- patterns_dir: str = "./patterns", project_root: str = ".", verbose: bool = False
107
+ patterns_dir: str = "./patterns",
108
+ project_root: str = ".",
109
+ verbose: bool = False,
110
110
  ) -> int:
111
- """
112
- Start-of-day developer briefing.
111
+ """Start-of-day developer briefing.
113
112
 
114
113
  Shows:
115
114
  - Health check summary
@@ -231,7 +230,7 @@ def morning_workflow(
231
230
  ]
232
231
  if investigating_bugs:
233
232
  suggestions.append(
234
- f"Resolve {len(investigating_bugs)} investigating bug(s) via 'empathy patterns resolve'"
233
+ f"Resolve {len(investigating_bugs)} investigating bug(s) via 'empathy patterns resolve'",
235
234
  )
236
235
 
237
236
  if trend == "increasing":
@@ -258,14 +257,93 @@ def morning_workflow(
258
257
  return 0
259
258
 
260
259
 
260
+ def _run_tests_only(project_root: str = ".", verbose: bool = False) -> int:
261
+ """Run tests only (used by ship --tests-only)."""
262
+ print("\n" + "=" * 60)
263
+ print(" TEST RESULTS")
264
+ print("=" * 60 + "\n")
265
+
266
+ # Try pytest first
267
+ success, output = _run_command(["python", "-m", "pytest", project_root, "-v", "--tb=short"])
268
+
269
+ if success:
270
+ print("All tests passed!")
271
+ print("\n" + "=" * 60 + "\n")
272
+ return 0
273
+ print("Test Results:")
274
+ print("-" * 40)
275
+ print(output)
276
+ print("\n" + "=" * 60 + "\n")
277
+ return 1
278
+
279
+
280
+ def _run_security_only(project_root: str = ".", verbose: bool = False) -> int:
281
+ """Run security checks only (used by ship --security-only)."""
282
+ print("\n" + "=" * 60)
283
+ print(" SECURITY SCAN")
284
+ print("=" * 60 + "\n")
285
+
286
+ issues = []
287
+
288
+ # Try bandit (Python security scanner)
289
+ print("1. Running Bandit security scan...")
290
+ success, output = _run_command(["bandit", "-r", project_root, "-ll", "-q"])
291
+ if success:
292
+ print(" PASS - No high/medium security issues")
293
+ elif "bandit" in output.lower() and "not found" in output.lower():
294
+ print(" SKIP - Bandit not installed (pip install bandit)")
295
+ else:
296
+ issue_count = output.count(">> Issue:")
297
+ issues.append(f"Bandit: {issue_count} security issues")
298
+ print(f" WARN - {issue_count} issues found")
299
+ if verbose:
300
+ print(output)
301
+
302
+ # Check for secrets in code
303
+ print("2. Checking for hardcoded secrets...")
304
+ success, output = _run_command(
305
+ ["grep", "-rn", "--include=*.py", "password.*=.*['\"]", project_root],
306
+ )
307
+ if not success or not output.strip():
308
+ print(" PASS - No obvious hardcoded secrets")
309
+ else:
310
+ lines = len([line for line in output.split("\n") if line.strip()])
311
+ issues.append(f"Secrets: {lines} potential hardcoded secrets")
312
+ print(f" WARN - {lines} potential hardcoded values found")
313
+
314
+ # Check for .env files that might be committed
315
+ print("3. Checking for sensitive files...")
316
+ success, output = _run_command(["git", "ls-files", ".env", "*.pem", "*.key"])
317
+ if not output.strip():
318
+ print(" PASS - No sensitive files tracked")
319
+ else:
320
+ files = len([line for line in output.split("\n") if line.strip()])
321
+ issues.append(f"Files: {files} sensitive files in git")
322
+ print(f" WARN - {files} sensitive files tracked in git")
323
+
324
+ # Summary
325
+ print("\n" + "-" * 60)
326
+ if issues:
327
+ print("\nSECURITY ISSUES FOUND:")
328
+ for issue in issues:
329
+ print(f" - {issue}")
330
+ print("\n" + "=" * 60 + "\n")
331
+ return 1
332
+
333
+ print("\nNo security issues found!")
334
+ print("\n" + "=" * 60 + "\n")
335
+ return 0
336
+
337
+
261
338
  def ship_workflow(
262
339
  patterns_dir: str = "./patterns",
263
340
  project_root: str = ".",
264
341
  skip_sync: bool = False,
342
+ tests_only: bool = False,
343
+ security_only: bool = False,
265
344
  verbose: bool = False,
266
345
  ) -> int:
267
- """
268
- Pre-commit validation pipeline.
346
+ """Pre-commit validation pipeline.
269
347
 
270
348
  Runs:
271
349
  1. empathy inspect (code analysis)
@@ -273,8 +351,23 @@ def ship_workflow(
273
351
  3. empathy sync-claude (pattern sync)
274
352
  4. Summary
275
353
 
354
+ Args:
355
+ patterns_dir: Path to patterns directory
356
+ project_root: Project root directory
357
+ skip_sync: Skip syncing patterns to Claude
358
+ tests_only: Run tests only (skip lint/format checks)
359
+ security_only: Run security checks only
360
+ verbose: Show detailed output
361
+
276
362
  Returns exit code (0 = ready to ship, non-zero = issues found).
363
+
277
364
  """
365
+ if tests_only:
366
+ return _run_tests_only(project_root, verbose)
367
+
368
+ if security_only:
369
+ return _run_security_only(project_root, verbose)
370
+
278
371
  print("\n" + "=" * 60)
279
372
  print(" PRE-SHIP CHECKLIST")
280
373
  print("=" * 60 + "\n")
@@ -289,7 +382,7 @@ def ship_workflow(
289
382
  print(" PASS - No lint issues")
290
383
  else:
291
384
  issue_count = len(
292
- [line for line in output.split("\n") if line.strip() and not line.startswith("Found")]
385
+ [line for line in output.split("\n") if line.strip() and not line.startswith("Found")],
293
386
  )
294
387
  issues.append(f"Lint: {issue_count} issues")
295
388
  print(f" FAIL - {issue_count} issues found")
@@ -307,7 +400,7 @@ def ship_workflow(
307
400
  line
308
401
  for line in output.split("\n")
309
402
  if "would be reformatted" in line.lower() or line.strip().endswith(".py")
310
- ]
403
+ ],
311
404
  )
312
405
  warnings.append(f"Format: {files} files need formatting")
313
406
  print(f" WARN - {files} files need formatting (run 'empathy fix-all')")
@@ -330,7 +423,7 @@ def ship_workflow(
330
423
  success, output = _run_command(["git", "status", "--porcelain"])
331
424
  if success:
332
425
  staged = len(
333
- [line for line in output.split("\n") if line.startswith(("A ", "M ", "D ", "R "))]
426
+ [line for line in output.split("\n") if line.startswith(("A ", "M ", "D ", "R "))],
334
427
  )
335
428
  unstaged = len([line for line in output.split("\n") if line.startswith((" M", " D", "??"))])
336
429
  if staged > 0:
@@ -346,15 +439,14 @@ def ship_workflow(
346
439
  print("5. Syncing patterns to Claude Code...")
347
440
  # Import here to avoid circular imports
348
441
  try:
349
- from empathy_llm_toolkit.cli.sync_claude import (
350
- sync_patterns_to_claude, # type: ignore[attr-defined]
351
- )
352
-
353
- result = sync_patterns_to_claude(
354
- patterns_dir=patterns_dir, output_dir=".claude/rules/empathy"
355
- )
356
- if result.get("success"):
357
- print(f" PASS - {result.get('patterns_synced', 0)} patterns synced")
442
+ from pathlib import Path
443
+
444
+ from empathy_llm_toolkit.cli.sync_claude import sync_patterns
445
+
446
+ result = sync_patterns(project_root=Path(), verbose=False)
447
+ synced_count = len(result.get("synced", []))
448
+ if synced_count > 0:
449
+ print(f" PASS - {synced_count} patterns synced")
358
450
  else:
359
451
  print(" SKIP - No patterns to sync")
360
452
  except ImportError:
@@ -395,8 +487,7 @@ def ship_workflow(
395
487
 
396
488
 
397
489
  def fix_all_workflow(project_root: str = ".", dry_run: bool = False, verbose: bool = False) -> int:
398
- """
399
- Auto-fix all fixable issues.
490
+ """Auto-fix all fixable issues.
400
491
 
401
492
  Runs:
402
493
  1. ruff --fix (lint fixes)
@@ -444,7 +535,7 @@ def fix_all_workflow(project_root: str = ".", dry_run: bool = False, verbose: bo
444
535
  line
445
536
  for line in output.split("\n")
446
537
  if line.strip().endswith(".py") and "reformatted" in output.lower()
447
- ]
538
+ ],
448
539
  )
449
540
 
450
541
  print(f" Formatted {formatted} files")
@@ -488,8 +579,7 @@ def learn_workflow(
488
579
  watch: bool = False,
489
580
  verbose: bool = False,
490
581
  ) -> int:
491
- """
492
- Watch for bug fixes and extract patterns.
582
+ """Watch for bug fixes and extract patterns.
493
583
 
494
584
  Modes:
495
585
  - analyze: Analyze recent commits for bug fix patterns
@@ -516,7 +606,7 @@ def learn_workflow(
516
606
 
517
607
  # Get recent commits
518
608
  success, output = _run_command(
519
- ["git", "log", f"-{commit_count}", "--oneline", "--format=%H|%s|%an|%ai"]
609
+ ["git", "log", f"-{commit_count}", "--oneline", "--format=%H|%s|%an|%ai"],
520
610
  )
521
611
 
522
612
  if not success:
@@ -660,6 +750,8 @@ def cmd_ship(args):
660
750
  patterns_dir=getattr(args, "patterns_dir", "./patterns"),
661
751
  project_root=getattr(args, "project_root", "."),
662
752
  skip_sync=getattr(args, "skip_sync", False),
753
+ tests_only=getattr(args, "tests_only", False),
754
+ security_only=getattr(args, "security_only", False),
663
755
  verbose=getattr(args, "verbose", False),
664
756
  )
665
757
 
@@ -0,0 +1,360 @@
1
+ """Multi-Model Workflow Templates for Empathy Framework
2
+
3
+ Cost-optimized workflow patterns that leverage 3-tier model routing:
4
+ - Haiku (cheap): Summarization, classification, triage
5
+ - Sonnet (capable): Analysis, code generation, security review
6
+ - Opus (premium): Synthesis, architectural decisions, coordination
7
+
8
+ Usage:
9
+ from empathy_os.workflows import ResearchSynthesisWorkflow
10
+
11
+ workflow = ResearchSynthesisWorkflow()
12
+ result = await workflow.execute(
13
+ sources=["doc1.md", "doc2.md"],
14
+ question="What are the key patterns?"
15
+ )
16
+
17
+ print(f"Cost: ${result.cost_report.total_cost:.4f}")
18
+ print(f"Saved: {result.cost_report.savings_percent:.1f}% vs premium-only")
19
+
20
+ Workflow Discovery:
21
+ Workflows can be discovered via entry points (pyproject.toml):
22
+
23
+ [project.entry-points."empathy.workflows"]
24
+ my-workflow = "my_package.workflows:MyWorkflow"
25
+
26
+ Then call discover_workflows() to load all registered workflows.
27
+
28
+ Copyright 2025 Smart-AI-Memory
29
+ Licensed under Fair Source License 0.9
30
+ """
31
+
32
+ import importlib.metadata
33
+ import importlib.util
34
+ import os
35
+ from typing import TYPE_CHECKING
36
+
37
+ if TYPE_CHECKING:
38
+ from .base import BaseWorkflow
39
+
40
+ from .base import (
41
+ PROVIDER_MODELS,
42
+ BaseWorkflow,
43
+ CostReport,
44
+ ModelProvider,
45
+ ModelTier,
46
+ WorkflowResult,
47
+ WorkflowStage,
48
+ get_workflow_stats,
49
+ )
50
+
51
+ # New high-value workflows
52
+ from .bug_predict import BugPredictionWorkflow
53
+ from .code_review import CodeReviewWorkflow
54
+
55
+ # Code review crew integration (v3.1)
56
+ from .code_review_pipeline import CodeReviewPipeline, CodeReviewPipelineResult
57
+ from .config import DEFAULT_MODELS, ModelConfig, WorkflowConfig, create_example_config, get_model
58
+ from .dependency_check import DependencyCheckWorkflow
59
+ from .document_gen import DocumentGenerationWorkflow
60
+ from .documentation_orchestrator import DocumentationOrchestrator, OrchestratorResult
61
+ from .health_check import HealthCheckWorkflow
62
+
63
+ # Keyboard Conductor (v3.6) - keyboard shortcut generation
64
+ from .keyboard_shortcuts import KeyboardShortcutWorkflow
65
+ from .manage_documentation import ManageDocumentationCrew, ManageDocumentationCrewResult
66
+ from .perf_audit import PerformanceAuditWorkflow
67
+ from .pr_review import PRReviewResult, PRReviewWorkflow
68
+ from .refactor_plan import RefactorPlanWorkflow
69
+ from .release_prep import ReleasePreparationWorkflow
70
+ from .research_synthesis import ResearchSynthesisWorkflow
71
+
72
+ # Security crew integration (v3.0)
73
+ from .secure_release import SecureReleasePipeline, SecureReleaseResult
74
+ from .security_audit import SecurityAuditWorkflow
75
+ from .step_config import WorkflowStepConfig, steps_from_tier_map, validate_step_config
76
+
77
+ # User-generated workflows
78
+ from .test5 import Test5Workflow
79
+ from .test_gen import TestGenerationWorkflow
80
+
81
+ # Re-export CLI commands from workflow_commands.py
82
+ _parent_dir = os.path.dirname(os.path.dirname(__file__))
83
+ _workflows_module_path = os.path.join(_parent_dir, "workflow_commands.py")
84
+
85
+ # Initialize to None for type checking
86
+ cmd_morning = None
87
+ cmd_ship = None
88
+ cmd_fix_all = None
89
+ cmd_learn = None
90
+
91
+ if os.path.exists(_workflows_module_path):
92
+ _spec = importlib.util.spec_from_file_location("_workflows_cli", _workflows_module_path)
93
+ if _spec is not None and _spec.loader is not None:
94
+ _workflows_cli = importlib.util.module_from_spec(_spec)
95
+ _spec.loader.exec_module(_workflows_cli)
96
+
97
+ # Re-export CLI commands
98
+ cmd_morning = _workflows_cli.cmd_morning
99
+ cmd_ship = _workflows_cli.cmd_ship
100
+ cmd_fix_all = _workflows_cli.cmd_fix_all
101
+ cmd_learn = _workflows_cli.cmd_learn
102
+
103
+ # Default workflow registry (statically defined for backwards compatibility)
104
+ # Note: Some entries are composite pipelines, not direct BaseWorkflow subclasses
105
+ _DEFAULT_WORKFLOWS: dict[str, type] = {
106
+ # Core workflows
107
+ "code-review": CodeReviewWorkflow,
108
+ "doc-gen": DocumentGenerationWorkflow,
109
+ # Analysis workflows
110
+ "bug-predict": BugPredictionWorkflow,
111
+ "security-audit": SecurityAuditWorkflow,
112
+ "perf-audit": PerformanceAuditWorkflow,
113
+ # Generation workflows
114
+ "test-gen": TestGenerationWorkflow, # Enabled by default for test coverage
115
+ "refactor-plan": RefactorPlanWorkflow,
116
+ # Operational workflows
117
+ "dependency-check": DependencyCheckWorkflow,
118
+ "release-prep": ReleasePreparationWorkflow,
119
+ # Composite security pipeline (v3.0)
120
+ "secure-release": SecureReleasePipeline,
121
+ # Code review crew integration (v3.1)
122
+ "pro-review": CodeReviewPipeline,
123
+ "pr-review": PRReviewWorkflow,
124
+ # Health check crew integration (v3.1)
125
+ "health-check": HealthCheckWorkflow,
126
+ # Documentation management (v3.5)
127
+ "doc-orchestrator": DocumentationOrchestrator,
128
+ "manage-docs": ManageDocumentationCrew,
129
+ # Keyboard Conductor (v3.6) - keyboard shortcut generation
130
+ "keyboard-shortcuts": KeyboardShortcutWorkflow,
131
+ # User-generated workflows
132
+ "test5": Test5Workflow,
133
+ }
134
+
135
+ # Opt-in workflows - not included by default, must be explicitly enabled
136
+ # Currently empty - all workflows are enabled by default
137
+ # Use disabled_workflows in config to turn off specific workflows
138
+ _OPT_IN_WORKFLOWS: dict[str, type] = {}
139
+
140
+ # Workflow registry populated at module load
141
+ WORKFLOW_REGISTRY: dict[str, type[BaseWorkflow]] = {}
142
+
143
+
144
+ def discover_workflows(
145
+ include_defaults: bool = True,
146
+ config: "WorkflowConfig | None" = None,
147
+ ) -> dict[str, type[BaseWorkflow]]:
148
+ """Discover workflows via entry points and config.
149
+
150
+ This function loads workflows registered as entry points under the
151
+ 'empathy.workflows' group. This allows third-party packages to register
152
+ custom workflows that integrate with the Empathy Framework.
153
+
154
+ Workflow availability is controlled by:
155
+ 1. Default workflows (always included unless disabled)
156
+ 2. Opt-in workflows (test-gen) - must be explicitly enabled OR compliance_mode=hipaa
157
+ 3. enabled_workflows config - explicitly enable specific workflows
158
+ 4. disabled_workflows config - explicitly disable specific workflows
159
+ 5. Entry point discovery - third-party workflows
160
+
161
+ Args:
162
+ include_defaults: Whether to include default built-in workflows
163
+ config: Optional WorkflowConfig for enabled/disabled workflows
164
+
165
+ Returns:
166
+ Dictionary mapping workflow names to workflow classes
167
+
168
+ Example:
169
+ # In your pyproject.toml:
170
+ [project.entry-points."empathy.workflows"]
171
+ my-workflow = "my_package.workflows:MyCustomWorkflow"
172
+
173
+ # In your code:
174
+ from empathy_os.workflows import discover_workflows
175
+ workflows = discover_workflows()
176
+ MyWorkflow = workflows.get("my-workflow")
177
+
178
+ # With HIPAA mode (enables test-gen):
179
+ config = WorkflowConfig.load() # compliance_mode: hipaa
180
+ workflows = discover_workflows(config=config)
181
+
182
+ """
183
+ discovered: dict[str, type[BaseWorkflow]] = {}
184
+
185
+ # Include default workflows if requested
186
+ if include_defaults:
187
+ discovered.update(_DEFAULT_WORKFLOWS)
188
+
189
+ # Add opt-in workflows based on config
190
+ if config is not None:
191
+ # HIPAA mode auto-enables healthcare workflows
192
+ if config.is_hipaa_mode():
193
+ discovered.update(_OPT_IN_WORKFLOWS)
194
+
195
+ # Explicitly enabled workflows
196
+ for workflow_name in config.enabled_workflows:
197
+ if workflow_name in _OPT_IN_WORKFLOWS:
198
+ discovered[workflow_name] = _OPT_IN_WORKFLOWS[workflow_name]
199
+
200
+ # Explicitly disabled workflows
201
+ for workflow_name in config.disabled_workflows:
202
+ discovered.pop(workflow_name, None)
203
+
204
+ # Discover via entry points
205
+ try:
206
+ eps = importlib.metadata.entry_points(group="empathy.workflows")
207
+ for ep in eps:
208
+ try:
209
+ workflow_cls = ep.load()
210
+ # Validate it's a proper workflow class
211
+ if isinstance(workflow_cls, type) and hasattr(workflow_cls, "execute"):
212
+ # Check if disabled in config
213
+ if config is None or ep.name not in config.disabled_workflows:
214
+ discovered[ep.name] = workflow_cls
215
+ except Exception:
216
+ # Skip invalid entry points silently
217
+ pass
218
+ except Exception:
219
+ # If entry point discovery fails, just use defaults
220
+ pass
221
+
222
+ return discovered
223
+
224
+
225
+ def refresh_workflow_registry(config: "WorkflowConfig | None" = None) -> None:
226
+ """Refresh the global WORKFLOW_REGISTRY by re-discovering all workflows.
227
+
228
+ Call this after installing new packages that register workflows,
229
+ or after changing the WorkflowConfig (e.g., enabling HIPAA mode).
230
+
231
+ Args:
232
+ config: Optional WorkflowConfig for enabled/disabled workflows
233
+
234
+ """
235
+ global WORKFLOW_REGISTRY
236
+ WORKFLOW_REGISTRY.clear()
237
+ WORKFLOW_REGISTRY.update(discover_workflows(config=config))
238
+
239
+
240
+ def get_opt_in_workflows() -> dict[str, type]:
241
+ """Get the list of opt-in workflows that require explicit enabling.
242
+
243
+ Returns:
244
+ Dictionary of workflow name to class for opt-in workflows
245
+
246
+ """
247
+ return dict(_OPT_IN_WORKFLOWS)
248
+
249
+
250
+ # Initialize registry on module load
251
+ WORKFLOW_REGISTRY.update(discover_workflows())
252
+
253
+
254
+ def get_workflow(name: str) -> type[BaseWorkflow]:
255
+ """Get a workflow class by name.
256
+
257
+ Args:
258
+ name: Workflow name (e.g., "research", "code-review", "doc-gen")
259
+
260
+ Returns:
261
+ Workflow class
262
+
263
+ Raises:
264
+ KeyError: If workflow not found
265
+
266
+ """
267
+ if name not in WORKFLOW_REGISTRY:
268
+ available = ", ".join(WORKFLOW_REGISTRY.keys())
269
+ raise KeyError(f"Unknown workflow: {name}. Available: {available}")
270
+ return WORKFLOW_REGISTRY[name]
271
+
272
+
273
+ def list_workflows() -> list[dict]:
274
+ """List all available workflows with descriptions.
275
+
276
+ Returns:
277
+ List of workflow info dicts
278
+
279
+ """
280
+ workflows = []
281
+ for name, cls in WORKFLOW_REGISTRY.items():
282
+ # Handle both BaseWorkflow subclasses and composite pipelines
283
+ stages = getattr(cls, "stages", [])
284
+ tier_map = getattr(cls, "tier_map", {})
285
+ description = getattr(cls, "description", "No description")
286
+
287
+ workflows.append(
288
+ {
289
+ "name": name,
290
+ "class": cls.__name__,
291
+ "description": description,
292
+ "stages": stages,
293
+ "tier_map": {k: v.value for k, v in tier_map.items()} if tier_map else {},
294
+ },
295
+ )
296
+ return workflows
297
+
298
+
299
+ __all__ = [
300
+ "DEFAULT_MODELS",
301
+ "PROVIDER_MODELS",
302
+ # Registry and discovery
303
+ "WORKFLOW_REGISTRY",
304
+ # Base classes
305
+ "BaseWorkflow",
306
+ # New high-value workflows
307
+ "BugPredictionWorkflow",
308
+ # Code review crew integration (v3.1)
309
+ "CodeReviewPipeline",
310
+ "CodeReviewPipelineResult",
311
+ "CodeReviewWorkflow",
312
+ "CostReport",
313
+ "DependencyCheckWorkflow",
314
+ "DocumentGenerationWorkflow",
315
+ # Documentation management (v3.5)
316
+ "DocumentationOrchestrator",
317
+ # Health check crew integration (v3.1)
318
+ "HealthCheckWorkflow",
319
+ # Keyboard Conductor (v3.6)
320
+ "KeyboardShortcutWorkflow",
321
+ "ManageDocumentationCrew",
322
+ "ManageDocumentationCrewResult",
323
+ "ModelConfig",
324
+ "ModelProvider",
325
+ "ModelTier",
326
+ "OrchestratorResult",
327
+ "PRReviewResult",
328
+ "PRReviewWorkflow",
329
+ "PerformanceAuditWorkflow",
330
+ "RefactorPlanWorkflow",
331
+ "ReleasePreparationWorkflow",
332
+ # Workflow implementations
333
+ "ResearchSynthesisWorkflow",
334
+ # Security crew integration (v3.0)
335
+ "SecureReleasePipeline",
336
+ "SecureReleaseResult",
337
+ "SecurityAuditWorkflow",
338
+ "TestGenerationWorkflow",
339
+ # Configuration
340
+ "WorkflowConfig",
341
+ "WorkflowResult",
342
+ "WorkflowStage",
343
+ # Step configuration (new)
344
+ "WorkflowStepConfig",
345
+ "cmd_fix_all",
346
+ "cmd_learn",
347
+ # CLI commands (re-exported from workflow_commands.py)
348
+ "cmd_morning",
349
+ "cmd_ship",
350
+ "create_example_config",
351
+ "discover_workflows",
352
+ "get_model",
353
+ "get_workflow",
354
+ # Stats for dashboard
355
+ "get_workflow_stats",
356
+ "list_workflows",
357
+ "refresh_workflow_registry",
358
+ "steps_from_tier_map",
359
+ "validate_step_config",
360
+ ]