empathy-framework 3.7.0__py3-none-any.whl → 3.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 (267) hide show
  1. coach_wizards/code_reviewer_README.md +60 -0
  2. coach_wizards/code_reviewer_wizard.py +180 -0
  3. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/METADATA +20 -2
  4. empathy_framework-3.7.1.dist-info/RECORD +327 -0
  5. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/top_level.txt +5 -1
  6. empathy_healthcare_plugin/monitors/__init__.py +9 -0
  7. empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
  8. empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
  9. empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
  10. empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
  11. empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
  12. empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
  13. empathy_llm_toolkit/agent_factory/__init__.py +53 -0
  14. empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
  15. empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
  16. empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
  17. empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
  18. empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
  19. empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
  20. empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
  21. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
  22. empathy_llm_toolkit/agent_factory/base.py +305 -0
  23. empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
  24. empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
  25. empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
  26. empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
  27. empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
  28. empathy_llm_toolkit/agent_factory/decorators.py +286 -0
  29. empathy_llm_toolkit/agent_factory/factory.py +558 -0
  30. empathy_llm_toolkit/agent_factory/framework.py +192 -0
  31. empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
  32. empathy_llm_toolkit/agent_factory/resilient.py +320 -0
  33. empathy_llm_toolkit/cli/__init__.py +8 -0
  34. empathy_llm_toolkit/cli/sync_claude.py +487 -0
  35. empathy_llm_toolkit/code_health.py +150 -3
  36. empathy_llm_toolkit/config/__init__.py +29 -0
  37. empathy_llm_toolkit/config/unified.py +295 -0
  38. empathy_llm_toolkit/routing/__init__.py +32 -0
  39. empathy_llm_toolkit/routing/model_router.py +362 -0
  40. empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
  41. empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
  42. empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  43. empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
  44. empathy_llm_toolkit/security/README.md +262 -0
  45. empathy_llm_toolkit/security/__init__.py +62 -0
  46. empathy_llm_toolkit/security/audit_logger.py +929 -0
  47. empathy_llm_toolkit/security/audit_logger_example.py +152 -0
  48. empathy_llm_toolkit/security/pii_scrubber.py +640 -0
  49. empathy_llm_toolkit/security/secrets_detector.py +678 -0
  50. empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
  51. empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
  52. empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
  53. empathy_llm_toolkit/wizards/__init__.py +38 -0
  54. empathy_llm_toolkit/wizards/base_wizard.py +364 -0
  55. empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
  56. empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
  57. empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
  58. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
  59. empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
  60. empathy_os/__init__.py +52 -52
  61. empathy_os/adaptive/__init__.py +13 -0
  62. empathy_os/adaptive/task_complexity.py +127 -0
  63. empathy_os/cli.py +118 -8
  64. empathy_os/cli_unified.py +121 -1
  65. empathy_os/config/__init__.py +63 -0
  66. empathy_os/config/xml_config.py +239 -0
  67. empathy_os/dashboard/__init__.py +15 -0
  68. empathy_os/dashboard/server.py +743 -0
  69. empathy_os/memory/__init__.py +195 -0
  70. empathy_os/memory/claude_memory.py +466 -0
  71. empathy_os/memory/config.py +224 -0
  72. empathy_os/memory/control_panel.py +1298 -0
  73. empathy_os/memory/edges.py +179 -0
  74. empathy_os/memory/graph.py +567 -0
  75. empathy_os/memory/long_term.py +1193 -0
  76. empathy_os/memory/nodes.py +179 -0
  77. empathy_os/memory/redis_bootstrap.py +540 -0
  78. empathy_os/memory/security/__init__.py +31 -0
  79. empathy_os/memory/security/audit_logger.py +930 -0
  80. empathy_os/memory/security/pii_scrubber.py +640 -0
  81. empathy_os/memory/security/secrets_detector.py +678 -0
  82. empathy_os/memory/short_term.py +2119 -0
  83. empathy_os/memory/storage/__init__.py +15 -0
  84. empathy_os/memory/summary_index.py +583 -0
  85. empathy_os/memory/unified.py +619 -0
  86. empathy_os/metrics/__init__.py +12 -0
  87. empathy_os/metrics/prompt_metrics.py +190 -0
  88. empathy_os/models/__init__.py +136 -0
  89. empathy_os/models/__main__.py +13 -0
  90. empathy_os/models/cli.py +655 -0
  91. empathy_os/models/empathy_executor.py +354 -0
  92. empathy_os/models/executor.py +252 -0
  93. empathy_os/models/fallback.py +671 -0
  94. empathy_os/models/provider_config.py +563 -0
  95. empathy_os/models/registry.py +382 -0
  96. empathy_os/models/tasks.py +302 -0
  97. empathy_os/models/telemetry.py +548 -0
  98. empathy_os/models/token_estimator.py +378 -0
  99. empathy_os/models/validation.py +274 -0
  100. empathy_os/monitoring/__init__.py +52 -0
  101. empathy_os/monitoring/alerts.py +23 -0
  102. empathy_os/monitoring/alerts_cli.py +268 -0
  103. empathy_os/monitoring/multi_backend.py +271 -0
  104. empathy_os/monitoring/otel_backend.py +363 -0
  105. empathy_os/optimization/__init__.py +19 -0
  106. empathy_os/optimization/context_optimizer.py +272 -0
  107. empathy_os/plugins/__init__.py +28 -0
  108. empathy_os/plugins/base.py +361 -0
  109. empathy_os/plugins/registry.py +268 -0
  110. empathy_os/project_index/__init__.py +30 -0
  111. empathy_os/project_index/cli.py +335 -0
  112. empathy_os/project_index/crew_integration.py +430 -0
  113. empathy_os/project_index/index.py +425 -0
  114. empathy_os/project_index/models.py +501 -0
  115. empathy_os/project_index/reports.py +473 -0
  116. empathy_os/project_index/scanner.py +538 -0
  117. empathy_os/prompts/__init__.py +61 -0
  118. empathy_os/prompts/config.py +77 -0
  119. empathy_os/prompts/context.py +177 -0
  120. empathy_os/prompts/parser.py +285 -0
  121. empathy_os/prompts/registry.py +313 -0
  122. empathy_os/prompts/templates.py +208 -0
  123. empathy_os/resilience/__init__.py +56 -0
  124. empathy_os/resilience/circuit_breaker.py +256 -0
  125. empathy_os/resilience/fallback.py +179 -0
  126. empathy_os/resilience/health.py +300 -0
  127. empathy_os/resilience/retry.py +209 -0
  128. empathy_os/resilience/timeout.py +135 -0
  129. empathy_os/routing/__init__.py +43 -0
  130. empathy_os/routing/chain_executor.py +433 -0
  131. empathy_os/routing/classifier.py +217 -0
  132. empathy_os/routing/smart_router.py +234 -0
  133. empathy_os/routing/wizard_registry.py +307 -0
  134. empathy_os/trust/__init__.py +28 -0
  135. empathy_os/trust/circuit_breaker.py +579 -0
  136. empathy_os/validation/__init__.py +19 -0
  137. empathy_os/validation/xml_validator.py +281 -0
  138. empathy_os/wizard_factory_cli.py +170 -0
  139. empathy_os/workflows/__init__.py +360 -0
  140. empathy_os/workflows/base.py +1530 -0
  141. empathy_os/workflows/bug_predict.py +962 -0
  142. empathy_os/workflows/code_review.py +960 -0
  143. empathy_os/workflows/code_review_adapters.py +310 -0
  144. empathy_os/workflows/code_review_pipeline.py +720 -0
  145. empathy_os/workflows/config.py +600 -0
  146. empathy_os/workflows/dependency_check.py +648 -0
  147. empathy_os/workflows/document_gen.py +1069 -0
  148. empathy_os/workflows/documentation_orchestrator.py +1205 -0
  149. empathy_os/workflows/health_check.py +679 -0
  150. empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
  151. empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
  152. empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
  153. empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
  154. empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
  155. empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
  156. empathy_os/workflows/manage_documentation.py +804 -0
  157. empathy_os/workflows/new_sample_workflow1.py +146 -0
  158. empathy_os/workflows/new_sample_workflow1_README.md +150 -0
  159. empathy_os/workflows/perf_audit.py +687 -0
  160. empathy_os/workflows/pr_review.py +748 -0
  161. empathy_os/workflows/progress.py +445 -0
  162. empathy_os/workflows/progress_server.py +322 -0
  163. empathy_os/workflows/refactor_plan.py +691 -0
  164. empathy_os/workflows/release_prep.py +808 -0
  165. empathy_os/workflows/research_synthesis.py +404 -0
  166. empathy_os/workflows/secure_release.py +585 -0
  167. empathy_os/workflows/security_adapters.py +297 -0
  168. empathy_os/workflows/security_audit.py +1050 -0
  169. empathy_os/workflows/step_config.py +234 -0
  170. empathy_os/workflows/test5.py +125 -0
  171. empathy_os/workflows/test5_README.md +158 -0
  172. empathy_os/workflows/test_gen.py +1855 -0
  173. empathy_os/workflows/test_lifecycle.py +526 -0
  174. empathy_os/workflows/test_maintenance.py +626 -0
  175. empathy_os/workflows/test_maintenance_cli.py +590 -0
  176. empathy_os/workflows/test_maintenance_crew.py +821 -0
  177. empathy_os/workflows/xml_enhanced_crew.py +285 -0
  178. empathy_software_plugin/cli/__init__.py +120 -0
  179. empathy_software_plugin/cli/inspect.py +362 -0
  180. empathy_software_plugin/cli.py +3 -1
  181. empathy_software_plugin/wizards/__init__.py +42 -0
  182. empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
  183. empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
  184. empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
  185. empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
  186. empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
  187. empathy_software_plugin/wizards/base_wizard.py +288 -0
  188. empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
  189. empathy_software_plugin/wizards/code_review_wizard.py +606 -0
  190. empathy_software_plugin/wizards/debugging/__init__.py +50 -0
  191. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
  192. empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
  193. empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
  194. empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
  195. empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
  196. empathy_software_plugin/wizards/debugging/verification.py +369 -0
  197. empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
  198. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
  199. empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
  200. empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
  201. empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
  202. empathy_software_plugin/wizards/performance/__init__.py +9 -0
  203. empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
  204. empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
  205. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
  206. empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
  207. empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
  208. empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
  209. empathy_software_plugin/wizards/security/__init__.py +32 -0
  210. empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
  211. empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
  212. empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
  213. empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
  214. empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
  215. empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
  216. empathy_software_plugin/wizards/testing/__init__.py +27 -0
  217. empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
  218. empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
  219. empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
  220. empathy_software_plugin/wizards/testing_wizard.py +274 -0
  221. hot_reload/README.md +473 -0
  222. hot_reload/__init__.py +62 -0
  223. hot_reload/config.py +84 -0
  224. hot_reload/integration.py +228 -0
  225. hot_reload/reloader.py +298 -0
  226. hot_reload/watcher.py +179 -0
  227. hot_reload/websocket.py +176 -0
  228. scaffolding/README.md +589 -0
  229. scaffolding/__init__.py +35 -0
  230. scaffolding/__main__.py +14 -0
  231. scaffolding/cli.py +240 -0
  232. test_generator/__init__.py +38 -0
  233. test_generator/__main__.py +14 -0
  234. test_generator/cli.py +226 -0
  235. test_generator/generator.py +325 -0
  236. test_generator/risk_analyzer.py +216 -0
  237. workflow_patterns/__init__.py +33 -0
  238. workflow_patterns/behavior.py +249 -0
  239. workflow_patterns/core.py +76 -0
  240. workflow_patterns/output.py +99 -0
  241. workflow_patterns/registry.py +255 -0
  242. workflow_patterns/structural.py +288 -0
  243. workflow_scaffolding/__init__.py +11 -0
  244. workflow_scaffolding/__main__.py +12 -0
  245. workflow_scaffolding/cli.py +206 -0
  246. workflow_scaffolding/generator.py +265 -0
  247. agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
  248. agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
  249. agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
  250. agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
  251. agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
  252. agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
  253. agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
  254. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
  255. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
  256. agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
  257. agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
  258. agents/compliance_anticipation_agent.py +0 -1422
  259. agents/compliance_db.py +0 -339
  260. agents/epic_integration_wizard.py +0 -530
  261. agents/notifications.py +0 -291
  262. agents/trust_building_behaviors.py +0 -872
  263. empathy_framework-3.7.0.dist-info/RECORD +0 -105
  264. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/WHEEL +0 -0
  265. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/entry_points.txt +0 -0
  266. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/licenses/LICENSE +0 -0
  267. /empathy_os/{monitoring.py → agent_monitoring.py} +0 -0
@@ -0,0 +1,288 @@
1
+ """Structural workflow patterns.
2
+
3
+ How workflows are organized and structured.
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ from typing import Any
10
+
11
+ from .core import CodeSection, PatternCategory, WorkflowComplexity, WorkflowPattern
12
+
13
+
14
+ class SingleStagePattern(WorkflowPattern):
15
+ """Single-stage workflow - simplest pattern.
16
+
17
+ Use for: Quick tasks that don't need multiple steps.
18
+ Examples: Simple text analysis, single API call, basic validation.
19
+ """
20
+
21
+ id: str = "single-stage"
22
+ name: str = "Single Stage Workflow"
23
+ category: PatternCategory = PatternCategory.STRUCTURAL
24
+ description: str = "Simple one-stage workflow with single tier"
25
+ complexity: WorkflowComplexity = WorkflowComplexity.SIMPLE
26
+ use_cases: list[str] = [
27
+ "Quick analysis tasks",
28
+ "Single API calls",
29
+ "Basic validation or formatting",
30
+ ]
31
+ examples: list[str] = []
32
+ risk_weight: float = 1.0
33
+
34
+ def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
35
+ """Generate code for single-stage workflow."""
36
+ workflow_name = context.get("workflow_name", "MyWorkflow")
37
+ class_name = context.get("class_name", "MyWorkflow")
38
+ description = context.get("description", "Single-stage workflow")
39
+ tier = context.get("tier", "CAPABLE")
40
+
41
+ return [
42
+ CodeSection(
43
+ location="class_attributes",
44
+ code=f''' name = "{workflow_name}"
45
+ description = "{description}"
46
+ stages = ["process"]
47
+ tier_map = {{
48
+ "process": ModelTier.{tier},
49
+ }}''',
50
+ priority=1,
51
+ ),
52
+ CodeSection(
53
+ location="methods",
54
+ code=''' async def run_stage(
55
+ self,
56
+ stage_name: str,
57
+ tier: ModelTier,
58
+ input_data: Any,
59
+ ) -> tuple[Any, int, int]:
60
+ """Execute the single processing stage."""
61
+ if stage_name == "process":
62
+ return await self._process(input_data, tier)
63
+ raise ValueError(f"Unknown stage: {stage_name}")
64
+
65
+ async def _process(
66
+ self,
67
+ input_data: Any,
68
+ tier: ModelTier,
69
+ ) -> tuple[Any, int, int]:
70
+ """Process the input data.
71
+
72
+ Args:
73
+ input_data: Input data to process
74
+ tier: Model tier to use
75
+
76
+ Returns:
77
+ Tuple of (result, input_tokens, output_tokens)
78
+
79
+ """
80
+ # TODO: Implement processing logic
81
+ prompt = f"Process this input: {input_data}"
82
+
83
+ # Use LLM executor if available
84
+ if self.executor:
85
+ result = await self.executor.execute(
86
+ prompt=prompt,
87
+ tier=tier.to_unified() if hasattr(tier, "to_unified") else tier,
88
+ )
89
+ return result.content, result.input_tokens, result.output_tokens
90
+
91
+ # Fallback to basic processing
92
+ return {"result": "Processed", "input": input_data}, 0, 0''',
93
+ priority=2,
94
+ ),
95
+ ]
96
+
97
+
98
+ class MultiStagePattern(WorkflowPattern):
99
+ """Multi-stage workflow with sequential execution.
100
+
101
+ Use for: Complex tasks requiring multiple processing steps.
102
+ Examples: Code review (classify → scan → recommend), bug prediction.
103
+ """
104
+
105
+ id: str = "multi-stage"
106
+ name: str = "Multi-Stage Workflow"
107
+ category: PatternCategory = PatternCategory.STRUCTURAL
108
+ description: str = "Multiple sequential stages with different tiers"
109
+ complexity: WorkflowComplexity = WorkflowComplexity.MODERATE
110
+ use_cases: list[str] = [
111
+ "Code analysis pipelines",
112
+ "Multi-step processing",
113
+ "Tiered cost optimization",
114
+ ]
115
+ examples: list[str] = ["bug-predict", "code-review", "pr-review"]
116
+ risk_weight: float = 2.5
117
+
118
+ def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
119
+ """Generate code for multi-stage workflow."""
120
+ workflow_name = context.get("workflow_name", "my-workflow")
121
+ class_name = context.get("class_name", "MyWorkflow")
122
+ description = context.get("description", "Multi-stage workflow")
123
+ stages = context.get("stages", ["analyze", "process", "report"])
124
+ tier_map = context.get(
125
+ "tier_map",
126
+ {
127
+ "analyze": "CHEAP",
128
+ "process": "CAPABLE",
129
+ "report": "PREMIUM",
130
+ },
131
+ )
132
+
133
+ # Generate tier map code
134
+ tier_map_code = " tier_map = {\n"
135
+ for stage, tier in tier_map.items():
136
+ tier_map_code += f' "{stage}": ModelTier.{tier},\n'
137
+ tier_map_code += " }"
138
+
139
+ # Generate stage routing
140
+ stage_routing = []
141
+ for i, stage in enumerate(stages):
142
+ stage_routing.append(
143
+ f''' if stage_name == "{stage}":
144
+ return await self._{stage}(input_data, tier)'''
145
+ )
146
+
147
+ stage_routing_code = "\n".join(stage_routing)
148
+
149
+ # Generate stage method templates
150
+ stage_methods = []
151
+ for stage in stages:
152
+ stage_methods.append(
153
+ f''' async def _{stage}(
154
+ self,
155
+ input_data: Any,
156
+ tier: ModelTier,
157
+ ) -> tuple[Any, int, int]:
158
+ """{stage.replace("_", " ").title()} stage.
159
+
160
+ Args:
161
+ input_data: Input from previous stage
162
+ tier: Model tier to use
163
+
164
+ Returns:
165
+ Tuple of (result, input_tokens, output_tokens)
166
+
167
+ """
168
+ # TODO: Implement {stage} logic
169
+ prompt = f"{{stage}} stage: {{input_data}}"
170
+
171
+ if self.executor:
172
+ result = await self.executor.execute(
173
+ prompt=prompt,
174
+ tier=tier.to_unified() if hasattr(tier, "to_unified") else tier,
175
+ )
176
+ return result.content, result.input_tokens, result.output_tokens
177
+
178
+ return {{"stage": "{stage}", "input": input_data}}, 0, 0'''
179
+ )
180
+
181
+ return [
182
+ CodeSection(
183
+ location="class_attributes",
184
+ code=f''' name = "{workflow_name}"
185
+ description = "{description}"
186
+ stages = {stages}
187
+ {tier_map_code}''',
188
+ priority=1,
189
+ ),
190
+ CodeSection(
191
+ location="methods",
192
+ code=f''' async def run_stage(
193
+ self,
194
+ stage_name: str,
195
+ tier: ModelTier,
196
+ input_data: Any,
197
+ ) -> tuple[Any, int, int]:
198
+ """Route to specific stage implementation."""
199
+ {stage_routing_code}
200
+ raise ValueError(f"Unknown stage: {{stage_name}}")
201
+
202
+ {chr(10).join(stage_methods)}''',
203
+ priority=2,
204
+ ),
205
+ ]
206
+
207
+
208
+ class CrewBasedPattern(WorkflowPattern):
209
+ """Workflow that wraps a CrewAI crew.
210
+
211
+ Use for: Multi-agent collaboration tasks.
212
+ Examples: Health check, security audit, code review.
213
+ """
214
+
215
+ id: str = "crew-based"
216
+ name: str = "Crew-Based Workflow"
217
+ category: PatternCategory = PatternCategory.INTEGRATION
218
+ description: str = "Wraps CrewAI crew for multi-agent collaboration"
219
+ complexity: WorkflowComplexity = WorkflowComplexity.COMPLEX
220
+ use_cases: list[str] = [
221
+ "Multi-agent tasks",
222
+ "Complex analysis requiring specialized roles",
223
+ "Collaborative problem solving",
224
+ ]
225
+ examples: list[str] = ["health-check", "security-audit"]
226
+ conflicts_with: list[str] = ["single-stage"]
227
+ risk_weight: float = 3.5
228
+
229
+ def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
230
+ """Generate code for crew-based workflow."""
231
+ workflow_name = context.get("workflow_name", "my-crew-workflow")
232
+ class_name = context.get("class_name", "MyCrewWorkflow")
233
+ description = context.get("description", "Crew-based workflow")
234
+ crew_name = context.get("crew_name", "MyCrew")
235
+
236
+ return [
237
+ CodeSection(
238
+ location="class_attributes",
239
+ code=f''' name = "{workflow_name}"
240
+ description = "{description}"
241
+ stages = ["analyze", "fix"]
242
+ tier_map = {{
243
+ "analyze": ModelTier.CAPABLE,
244
+ "fix": ModelTier.CAPABLE,
245
+ }}''',
246
+ priority=1,
247
+ ),
248
+ CodeSection(
249
+ location="init_method",
250
+ code=""" self._crew: Any = None
251
+ self._crew_available = False""",
252
+ priority=1,
253
+ ),
254
+ CodeSection(
255
+ location="methods",
256
+ code=f''' async def _initialize_crew(self) -> None:
257
+ """Initialize the {crew_name}."""
258
+ if self._crew is not None:
259
+ return
260
+
261
+ try:
262
+ from empathy_llm_toolkit.agent_factory.crews import {crew_name}
263
+
264
+ self._crew = {crew_name}()
265
+ self._crew_available = True
266
+ logger.info("{crew_name} initialized successfully")
267
+ except ImportError as e:
268
+ logger.warning(f"{crew_name} not available: {{e}}")
269
+ self._crew_available = False
270
+
271
+ async def run_stage(
272
+ self,
273
+ stage_name: str,
274
+ tier: ModelTier,
275
+ input_data: Any,
276
+ ) -> tuple[Any, int, int]:
277
+ """Route to crew for execution."""
278
+ await self._initialize_crew()
279
+
280
+ if not self._crew_available:
281
+ return {{"error": "Crew not available"}}, 0, 0
282
+
283
+ # Execute crew task
284
+ result = await self._crew.execute(stage_name, input_data)
285
+ return result, 0, 0 # Crew handles token counting internally''',
286
+ priority=2,
287
+ ),
288
+ ]
@@ -0,0 +1,11 @@
1
+ """Workflow scaffolding module.
2
+
3
+ Generates workflow code from patterns.
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ from .generator import WorkflowGenerator
10
+
11
+ __all__ = ["WorkflowGenerator"]
@@ -0,0 +1,12 @@
1
+ """Entry point for workflow_scaffolding module.
2
+
3
+ Allows running as: python -m workflow_scaffolding
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ from .cli import main
10
+
11
+ if __name__ == "__main__":
12
+ main()
@@ -0,0 +1,206 @@
1
+ """CLI for workflow scaffolding.
2
+
3
+ Provides command-line interface for creating workflows.
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ import sys
10
+ from pathlib import Path
11
+
12
+ from rich.console import Console
13
+ from rich.table import Table
14
+
15
+ from workflow_patterns import get_workflow_pattern_registry
16
+
17
+ from .generator import WorkflowGenerator
18
+
19
+ console = Console()
20
+
21
+
22
+ def cmd_create(args):
23
+ """Create a new workflow."""
24
+ workflow_name = args.name
25
+ description = args.description or f"{workflow_name} workflow"
26
+ patterns = args.patterns.split(",") if args.patterns else []
27
+
28
+ # Auto-select patterns if none provided
29
+ if not patterns:
30
+ console.print("[yellow]No patterns specified, using defaults for simple workflow[/yellow]")
31
+ patterns = ["single-stage"]
32
+
33
+ # Create generator
34
+ generator = WorkflowGenerator()
35
+ registry = get_workflow_pattern_registry()
36
+
37
+ # Validate patterns
38
+ valid, error = registry.validate_pattern_combination(patterns)
39
+ if not valid:
40
+ console.print(f"[red]Error: {error}[/red]")
41
+ sys.exit(1)
42
+
43
+ console.print(f"[bold]Creating workflow:[/bold] {workflow_name}")
44
+ console.print(f"[bold]Description:[/bold] {description}")
45
+ console.print(f"[bold]Patterns:[/bold] {', '.join(patterns)}")
46
+
47
+ # Generate and write
48
+ output_dir = Path(args.output) if args.output else Path.cwd()
49
+
50
+ try:
51
+ written = generator.write_workflow(
52
+ output_dir=output_dir,
53
+ workflow_name=workflow_name,
54
+ description=description,
55
+ patterns=patterns,
56
+ stages=args.stages.split(",") if args.stages else None,
57
+ tier_map=_parse_tier_map(args.tier_map) if args.tier_map else None,
58
+ )
59
+
60
+ console.print("\n[green]✓[/green] Workflow created successfully!\n")
61
+ console.print("[bold]Generated files:[/bold]")
62
+ for file_type, path in written.items():
63
+ console.print(f" - {file_type}: {path}")
64
+
65
+ console.print("\n[bold]Next steps:[/bold]")
66
+ console.print("1. Review generated files")
67
+ console.print("2. Implement stage logic (search for TODO comments)")
68
+ console.print(f"3. Run tests: pytest {written['test']}")
69
+ console.print(f"4. Run workflow: empathy workflow run {workflow_name}")
70
+
71
+ except Exception as e:
72
+ console.print(f"[red]Error creating workflow: {e}[/red]")
73
+ sys.exit(1)
74
+
75
+
76
+ def cmd_list_patterns(args):
77
+ """List available patterns."""
78
+ registry = get_workflow_pattern_registry()
79
+ patterns = registry.list_all()
80
+
81
+ # Create table
82
+ table = Table(title="Workflow Patterns")
83
+ table.add_column("ID", style="cyan")
84
+ table.add_column("Name", style="green")
85
+ table.add_column("Category", style="yellow")
86
+ table.add_column("Complexity", style="magenta")
87
+ table.add_column("Risk", justify="right")
88
+
89
+ for pattern in sorted(patterns, key=lambda p: p.id):
90
+ table.add_row(
91
+ pattern.id,
92
+ pattern.name,
93
+ pattern.category.value,
94
+ pattern.complexity.value,
95
+ f"{pattern.risk_weight:.1f}",
96
+ )
97
+
98
+ console.print(table)
99
+
100
+ # Show usage examples
101
+ console.print("\n[bold]Common Combinations:[/bold]")
102
+ console.print(" Simple workflow: single-stage")
103
+ console.print(" Code analysis: multi-stage,code-scanner,conditional-tier")
104
+ console.print(" Multi-agent: crew-based,result-dataclass")
105
+ console.print(" Configurable: multi-stage,config-driven")
106
+
107
+
108
+ def cmd_recommend(args):
109
+ """Recommend patterns for a workflow type."""
110
+ registry = get_workflow_pattern_registry()
111
+ workflow_type = args.type
112
+
113
+ recommendations = registry.recommend_for_workflow(workflow_type)
114
+
115
+ if not recommendations:
116
+ console.print(f"[yellow]No recommendations found for type: {workflow_type}[/yellow]")
117
+ console.print(
118
+ "\nAvailable types: code-analysis, simple, multi-agent, configurable, cost-optimized"
119
+ )
120
+ return
121
+
122
+ console.print(f"[bold]Recommendations for '{workflow_type}':[/bold]\n")
123
+
124
+ for pattern in recommendations:
125
+ console.print(f"[cyan]{pattern.id}[/cyan] - {pattern.name}")
126
+ console.print(f" {pattern.description}")
127
+ if pattern.use_cases:
128
+ console.print(f" Use for: {', '.join(pattern.use_cases)}")
129
+ console.print()
130
+
131
+ pattern_ids = [p.id for p in recommendations]
132
+ console.print("[bold]Create command:[/bold]")
133
+ console.print(
134
+ f"python -m workflow_scaffolding create my-workflow --patterns {','.join(pattern_ids)}"
135
+ )
136
+
137
+
138
+ def _parse_tier_map(tier_map_str: str) -> dict[str, str]:
139
+ """Parse tier map from string.
140
+
141
+ Args:
142
+ tier_map_str: Format "stage1:CHEAP,stage2:CAPABLE"
143
+
144
+ Returns:
145
+ Dict mapping stage to tier
146
+
147
+ """
148
+ tier_map = {}
149
+ for pair in tier_map_str.split(","):
150
+ stage, tier = pair.split(":")
151
+ tier_map[stage.strip()] = tier.strip()
152
+ return tier_map
153
+
154
+
155
+ def main():
156
+ """Main CLI entry point."""
157
+ import argparse
158
+
159
+ parser = argparse.ArgumentParser(
160
+ description="Workflow Factory - Create workflows 12x faster",
161
+ formatter_class=argparse.RawDescriptionHelpFormatter,
162
+ )
163
+
164
+ subparsers = parser.add_subparsers(dest="command", help="Command to run")
165
+
166
+ # create command
167
+ parser_create = subparsers.add_parser("create", help="Create a new workflow")
168
+ parser_create.add_argument("name", help="Workflow name (kebab-case, e.g., bug-scanner)")
169
+ parser_create.add_argument("--description", "-d", help="Workflow description")
170
+ parser_create.add_argument(
171
+ "--patterns",
172
+ "-p",
173
+ help="Comma-separated pattern IDs (e.g., multi-stage,conditional-tier)",
174
+ )
175
+ parser_create.add_argument("--stages", "-s", help="Comma-separated stage names")
176
+ parser_create.add_argument(
177
+ "--tier-map",
178
+ "-t",
179
+ help="Tier map (e.g., analyze:CHEAP,process:CAPABLE)",
180
+ )
181
+ parser_create.add_argument("--output", "-o", help="Output directory (default: current)")
182
+ parser_create.set_defaults(func=cmd_create)
183
+
184
+ # list-patterns command
185
+ parser_list = subparsers.add_parser("list-patterns", help="List available patterns")
186
+ parser_list.set_defaults(func=cmd_list_patterns)
187
+
188
+ # recommend command
189
+ parser_recommend = subparsers.add_parser("recommend", help="Recommend patterns for a type")
190
+ parser_recommend.add_argument(
191
+ "type",
192
+ help="Workflow type (code-analysis, simple, multi-agent, etc.)",
193
+ )
194
+ parser_recommend.set_defaults(func=cmd_recommend)
195
+
196
+ args = parser.parse_args()
197
+
198
+ if not args.command:
199
+ parser.print_help()
200
+ sys.exit(1)
201
+
202
+ args.func(args)
203
+
204
+
205
+ if __name__ == "__main__":
206
+ main()