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
patterns/structural.py ADDED
@@ -0,0 +1,415 @@
1
+ """Structural patterns for wizard architecture.
2
+
3
+ Structural patterns define the overall flow and organization of a wizard:
4
+ - Linear Flow: Step-by-step wizard with review and approval
5
+ - Phased Processing: Multi-phase pipeline for complex analysis
6
+ - Session-Based: State management with session storage
7
+
8
+ Copyright 2025 Smart AI Memory, LLC
9
+ Licensed under Fair Source 0.9
10
+ """
11
+
12
+ from typing import Literal
13
+
14
+ from pydantic import BaseModel, Field
15
+
16
+ from .core import BasePattern, CodeGeneratorMixin, PatternCategory
17
+
18
+
19
+ class StepConfig(BaseModel):
20
+ """Configuration for a single wizard step."""
21
+
22
+ step: int = Field(..., description="Step number (1-indexed)", ge=1)
23
+ title: str = Field(..., description="Step title displayed to user")
24
+ prompt: str = Field(..., description="Instructional prompt for this step")
25
+ fields: list[str] = Field(..., description="List of field names to collect")
26
+ help_text: str = Field(..., description="Help text explaining the step")
27
+ is_review_step: bool = Field(
28
+ default=False,
29
+ description="Whether this is a review/approval step",
30
+ )
31
+
32
+
33
+ class LinearFlowPattern(BasePattern, CodeGeneratorMixin):
34
+ """Linear multi-step wizard pattern.
35
+
36
+ **Description:**
37
+ A wizard that guides users through a fixed sequence of steps, culminating
38
+ in a review step where they can preview and approve the final output.
39
+
40
+ **Usage:** 16 wizards (SOAP Note, SBAR, Care Plan, etc.)
41
+ **Reusability:** 0.9 (highly reusable)
42
+
43
+ **Key Features:**
44
+ - Fixed step sequence (no branching)
45
+ - Session-based state management
46
+ - Preview before finalization
47
+ - Explicit user approval required
48
+
49
+ **Generated Endpoints:**
50
+ - POST /start - Initialize wizard session
51
+ - POST /{wizard_id}/step - Submit step data
52
+ - POST /{wizard_id}/preview - Generate preview
53
+ - POST /{wizard_id}/save - Finalize with approval
54
+ - GET /{wizard_id}/report - Retrieve completed report
55
+ """
56
+
57
+ category: Literal[PatternCategory.STRUCTURAL] = PatternCategory.STRUCTURAL
58
+ total_steps: int = Field(..., description="Total number of steps", ge=2)
59
+ steps: dict[int, StepConfig] = Field(
60
+ ..., description="Step configurations keyed by step number"
61
+ )
62
+ requires_approval: bool = Field(
63
+ default=True,
64
+ description="Whether final step requires user approval",
65
+ )
66
+ session_storage: Literal["redis", "memory"] = Field(
67
+ default="redis",
68
+ description="Session storage backend (redis preferred, memory fallback)",
69
+ )
70
+
71
+ def generate_endpoint_list(self) -> list[str]:
72
+ """Generate list of FastAPI endpoints for this wizard."""
73
+ return [
74
+ "POST /start",
75
+ "POST /{wizard_id}/step",
76
+ "POST /{wizard_id}/preview",
77
+ "POST /{wizard_id}/save",
78
+ "GET /{wizard_id}/report",
79
+ ]
80
+
81
+ def generate_code(self) -> str:
82
+ """Generate FastAPI router skeleton for linear flow wizard."""
83
+ endpoints = "\n".join(f" - {endpoint}" for endpoint in self.generate_endpoint_list())
84
+
85
+ return f'''
86
+ """Linear Flow Wizard - Generated from LinearFlowPattern
87
+
88
+ Total Steps: {self.total_steps}
89
+ Requires Approval: {self.requires_approval}
90
+ Session Storage: {self.session_storage}
91
+
92
+ Endpoints:
93
+ {endpoints}
94
+ """
95
+
96
+ from fastapi import APIRouter, HTTPException
97
+ from typing import Any
98
+ from uuid import uuid4
99
+ from datetime import datetime
100
+
101
+ router = APIRouter()
102
+
103
+ # Step configuration
104
+ WIZARD_STEPS = {{
105
+ {self._generate_step_configs()}
106
+ }}
107
+
108
+
109
+ @router.post("/start")
110
+ async def start_wizard():
111
+ """Initialize wizard session"""
112
+ wizard_id = str(uuid4())
113
+
114
+ session_data = {{
115
+ "wizard_id": wizard_id,
116
+ "current_step": 1,
117
+ "total_steps": {self.total_steps},
118
+ "collected_data": {{}},
119
+ "created_at": datetime.now().isoformat(),
120
+ }}
121
+
122
+ # Store session (implement _store_session)
123
+ await _store_session(wizard_id, session_data)
124
+
125
+ return {{"wizard_id": wizard_id, "current_step": WIZARD_STEPS[1]}}
126
+
127
+
128
+ @router.post("/{{wizard_id}}/step")
129
+ async def submit_step(wizard_id: str, step_data: dict[str, Any]):
130
+ """Submit data for current step"""
131
+ session = await _get_session(wizard_id)
132
+ if not session:
133
+ raise HTTPException(404, "Wizard session not found")
134
+
135
+ current_step = session["current_step"]
136
+ submitted_step = step_data.get("step", current_step)
137
+
138
+ # Validate step sequence
139
+ if submitted_step != current_step:
140
+ raise HTTPException(
141
+ 422,
142
+ f"Expected step {{current_step}}, got step {{submitted_step}}"
143
+ )
144
+
145
+ # Store data and advance
146
+ session["collected_data"].update(step_data.get("data", {{}}))
147
+ if current_step < {self.total_steps}:
148
+ session["current_step"] = current_step + 1
149
+
150
+ await _store_session(wizard_id, session)
151
+
152
+ return {{"current_step": WIZARD_STEPS[session["current_step"]]}}
153
+
154
+
155
+ @router.post("/{{wizard_id}}/preview")
156
+ async def preview_report(wizard_id: str):
157
+ """Generate preview without finalizing"""
158
+ session = await _get_session(wizard_id)
159
+ if not session:
160
+ raise HTTPException(404, "Wizard session not found")
161
+
162
+ if session["current_step"] != {self.total_steps}:
163
+ raise HTTPException(400, "Complete all steps before preview")
164
+
165
+ preview = _generate_report(session["collected_data"])
166
+ session["preview_report"] = preview
167
+ await _store_session(wizard_id, session)
168
+
169
+ return {{"preview": preview}}
170
+
171
+
172
+ @router.post("/{{wizard_id}}/save")
173
+ async def save_report(wizard_id: str, approval: dict[str, Any]):
174
+ """Finalize report with user approval"""
175
+ session = await _get_session(wizard_id)
176
+ if not session:
177
+ raise HTTPException(404, "Wizard session not found")
178
+
179
+ if "preview_report" not in session:
180
+ raise HTTPException(400, "Must generate preview first")
181
+
182
+ if not approval.get("user_approved", False):
183
+ raise HTTPException(400, "User approval required")
184
+
185
+ session["completed"] = True
186
+ session["completed_at"] = datetime.now().isoformat()
187
+ session["final_report"] = session["preview_report"]
188
+
189
+ await _store_session(wizard_id, session)
190
+
191
+ return {{"report": session["final_report"], "completed": True}}
192
+
193
+
194
+ @router.get("/{{wizard_id}}/report")
195
+ async def get_report(wizard_id: str):
196
+ """Retrieve completed report"""
197
+ session = await _get_session(wizard_id)
198
+ if not session:
199
+ raise HTTPException(404, "Wizard session not found")
200
+
201
+ if not session.get("completed", False):
202
+ raise HTTPException(422, "Wizard not yet completed")
203
+
204
+ return {{"report": _generate_report(session["collected_data"])}}
205
+
206
+
207
+ # Helper functions (implement these)
208
+ async def _store_session(wizard_id: str, session_data: dict):
209
+ """Store wizard session in {self.session_storage}"""
210
+ pass
211
+
212
+
213
+ async def _get_session(wizard_id: str) -> dict | None:
214
+ """Retrieve wizard session from {self.session_storage}"""
215
+ pass
216
+
217
+
218
+ def _generate_report(collected_data: dict) -> dict:
219
+ """Generate final report from collected data"""
220
+ pass
221
+ '''
222
+
223
+ def _generate_step_configs(self) -> str:
224
+ """Generate Python dict literal for step configurations."""
225
+ lines = []
226
+ for step_num, step_config in sorted(self.steps.items()):
227
+ lines.append(f" {step_num}: {{")
228
+ lines.append(f' "step": {step_config.step},')
229
+ lines.append(f' "title": "{step_config.title}",')
230
+ lines.append(f' "prompt": "{step_config.prompt}",')
231
+ lines.append(f' "fields": {step_config.fields},')
232
+ lines.append(f' "help_text": "{step_config.help_text}",')
233
+ if step_config.is_review_step:
234
+ lines.append(' "is_review_step": True,')
235
+ lines.append(" },")
236
+ return "\n".join(lines)
237
+
238
+
239
+ class PhaseConfig(BaseModel):
240
+ """Configuration for a processing phase."""
241
+
242
+ name: str = Field(..., description="Phase name (e.g., 'parse', 'analyze')")
243
+ description: str = Field(..., description="What this phase does")
244
+ required: bool = Field(
245
+ default=True,
246
+ description="Whether this phase is required",
247
+ )
248
+ parallel_with: list[str] = Field(
249
+ default_factory=list,
250
+ description="Phases that can run in parallel with this one",
251
+ )
252
+
253
+
254
+ class PhasedProcessingPattern(BasePattern, CodeGeneratorMixin):
255
+ """Multi-phase processing pipeline pattern.
256
+
257
+ **Description:**
258
+ A wizard that processes input through multiple sequential or parallel phases,
259
+ where each phase performs a specific transformation or analysis step.
260
+
261
+ **Usage:** 12 wizards (Advanced Debugging, Security Analysis, Performance Profiling)
262
+ **Reusability:** 0.85
263
+
264
+ **Key Features:**
265
+ - Sequential phase execution
266
+ - Optional parallel phases
267
+ - Context passed between phases
268
+ - Comprehensive result aggregation
269
+
270
+ **Common Phases:**
271
+ - Parse: Extract structured data from input
272
+ - Load Config: Load wizard/tool configuration
273
+ - Analyze: Perform core analysis
274
+ - Fix/Transform: Apply changes
275
+ - Verify: Confirm results
276
+
277
+ **Generated Method:**
278
+ async def analyze(context: dict) -> dict
279
+ """
280
+
281
+ category: Literal[PatternCategory.STRUCTURAL] = PatternCategory.STRUCTURAL
282
+ phases: list[PhaseConfig] = Field(..., description="List of processing phases in order")
283
+
284
+ def generate_code(self) -> str:
285
+ """Generate analyze() method skeleton with phases."""
286
+ phase_implementations = []
287
+
288
+ for i, phase in enumerate(self.phases, 1):
289
+ parallel_info = ""
290
+ if phase.parallel_with:
291
+ parallel_info = f" # Can run in parallel with: {', '.join(phase.parallel_with)}"
292
+
293
+ phase_implementations.append(
294
+ f"""
295
+ # Phase {i}: {phase.description}{parallel_info}
296
+ logger.info("Phase {i}: {phase.name}")
297
+ {phase.name}_result = await self._{phase.name}(context)
298
+ context["{phase.name}_result"] = {phase.name}_result
299
+ """
300
+ )
301
+
302
+ phases_code = "".join(phase_implementations)
303
+
304
+ return f'''
305
+ """Phased Processing Wizard - Generated from PhasedProcessingPattern
306
+
307
+ Phases:
308
+ {self._generate_phase_list()}
309
+ """
310
+
311
+ import logging
312
+ from typing import Any
313
+
314
+ logger = logging.getLogger(__name__)
315
+
316
+
317
+ class PhasedWizard:
318
+ """Multi-phase processing wizard"""
319
+
320
+ async def analyze(self, context: dict[str, Any]) -> dict[str, Any]:
321
+ """Execute all processing phases.
322
+
323
+ Args:
324
+ context: Input context with wizard-specific data
325
+
326
+ Returns:
327
+ Comprehensive analysis results from all phases
328
+ """
329
+ {phases_code}
330
+
331
+ # Aggregate results
332
+ return {{
333
+ "success": True,
334
+ {self._generate_result_fields()}
335
+ "metadata": {{
336
+ "phases_executed": {len(self.phases)},
337
+ "context_keys": list(context.keys()),
338
+ }},
339
+ }}
340
+
341
+ {self._generate_phase_methods()}
342
+ '''
343
+
344
+ def _generate_phase_list(self) -> str:
345
+ """Generate formatted list of phases."""
346
+ lines = []
347
+ for i, phase in enumerate(self.phases, 1):
348
+ required = "REQUIRED" if phase.required else "OPTIONAL"
349
+ lines.append(f" {i}. {phase.name} ({required}): {phase.description}")
350
+ return "\n".join(lines)
351
+
352
+ def _generate_result_fields(self) -> str:
353
+ """Generate result dictionary fields."""
354
+ lines = []
355
+ for phase in self.phases:
356
+ lines.append(f' "{phase.name}": {phase.name}_result,')
357
+ return "\n".join(lines)
358
+
359
+ def _generate_phase_methods(self) -> str:
360
+ """Generate stub methods for each phase."""
361
+ methods = []
362
+ for phase in self.phases:
363
+ methods.append(
364
+ f'''
365
+ async def _{phase.name}(self, context: dict[str, Any]) -> dict[str, Any]:
366
+ """Phase: {phase.description}
367
+
368
+ Args:
369
+ context: Shared context from previous phases
370
+
371
+ Returns:
372
+ Phase-specific results
373
+ """
374
+ # TODO: Implement {phase.name} phase
375
+ return {{"status": "not_implemented"}}
376
+ '''
377
+ )
378
+ return "\n".join(methods)
379
+
380
+
381
+ class SessionBasedPattern(BasePattern):
382
+ """Session-based wizard with state management.
383
+
384
+ **Description:**
385
+ Wizards that maintain state across multiple requests using session storage
386
+ (Redis preferred, memory fallback).
387
+
388
+ **Usage:** 16 wizards (all healthcare wizards)
389
+ **Reusability:** 0.95
390
+
391
+ **Key Features:**
392
+ - Session ID generation (UUID)
393
+ - State persistence (Redis + memory fallback)
394
+ - TTL management (auto-expiration)
395
+ - State recovery
396
+
397
+ **Session Data Structure:**
398
+ - wizard_id: Unique session identifier
399
+ - current_step: Current step number
400
+ - collected_data: User input data
401
+ - created_at/updated_at: Timestamps
402
+ - preview_report: Generated preview (optional)
403
+ - completed: Boolean flag
404
+ """
405
+
406
+ category: Literal[PatternCategory.STRUCTURAL] = PatternCategory.STRUCTURAL
407
+ session_ttl_seconds: int = Field(
408
+ default=7200,
409
+ description="Session TTL in seconds (default: 2 hours)",
410
+ ge=60,
411
+ )
412
+ storage_backend: Literal["redis", "memory", "both"] = Field(
413
+ default="both",
414
+ description="Session storage backend",
415
+ )
patterns/validation.py ADDED
@@ -0,0 +1,194 @@
1
+ """Validation patterns for wizard data integrity.
2
+
3
+ Validation patterns ensure wizard data is correct and authorized:
4
+ - Config Validation: Validate wizard configuration on initialization
5
+ - Step Validation: Ensure steps are completed in order
6
+ - User Approval: Require explicit user consent before finalization
7
+
8
+ Copyright 2025 Smart AI Memory, LLC
9
+ Licensed under Fair Source 0.9
10
+ """
11
+
12
+ from typing import Literal
13
+
14
+ from pydantic import Field
15
+
16
+ from .core import BasePattern, CodeGeneratorMixin, PatternCategory
17
+
18
+
19
+ class ConfigValidationPattern(BasePattern, CodeGeneratorMixin):
20
+ """Configuration validation pattern.
21
+
22
+ **Description:**
23
+ Wizards validate their configuration during initialization to fail fast
24
+ if misconfigured.
25
+
26
+ **Usage:** 16 wizards (all domain wizards)
27
+ **Reusability:** 0.9
28
+
29
+ **Validation Checks:**
30
+ - Empathy level in range (0-4)
31
+ - Classification valid (PUBLIC, INTERNAL, SENSITIVE)
32
+ - Required API keys present
33
+ - File paths exist
34
+
35
+ **Example:**
36
+ def _validate_config(self):
37
+ if not 0 <= self.config.empathy_level <= 4:
38
+ raise ValueError("Empathy level must be 0-4")
39
+ """
40
+
41
+ category: Literal[PatternCategory.VALIDATION] = PatternCategory.VALIDATION
42
+ validation_rules: list[str] = Field(
43
+ default_factory=list,
44
+ description="List of validation rules to check",
45
+ )
46
+ fail_fast: bool = Field(
47
+ default=True,
48
+ description="Whether to raise immediately on validation failure",
49
+ )
50
+
51
+ def generate_code(self) -> str:
52
+ """Generate _validate_config() method."""
53
+ return '''
54
+ def _validate_config(self):
55
+ """Validate wizard configuration.
56
+
57
+ Raises:
58
+ ValueError: If configuration is invalid
59
+
60
+ """
61
+ if not 0 <= self.config.default_empathy_level <= 4:
62
+ raise ValueError(
63
+ f"Empathy level must be 0-4, got {self.config.default_empathy_level}"
64
+ )
65
+
66
+ if self.config.default_classification not in ["PUBLIC", "INTERNAL", "SENSITIVE"]:
67
+ raise ValueError(
68
+ f"Invalid classification: {self.config.default_classification}"
69
+ )
70
+
71
+ # Add custom validation rules here
72
+ '''
73
+
74
+
75
+ class StepValidationPattern(BasePattern, CodeGeneratorMixin):
76
+ """Step sequence validation pattern.
77
+
78
+ **Description:**
79
+ Multi-step wizards validate that steps are completed in the correct order.
80
+ Users cannot skip steps or submit the wrong step.
81
+
82
+ **Usage:** 16 wizards (all healthcare wizards)
83
+ **Reusability:** 0.9
84
+
85
+ **Validation:**
86
+ - Current step matches submitted step
87
+ - Previous steps completed
88
+ - Step number in valid range
89
+
90
+ **HTTP Status Codes:**
91
+ - 422 Unprocessable Entity: Wrong step submitted
92
+ - 400 Bad Request: Step out of range
93
+ """
94
+
95
+ category: Literal[PatternCategory.VALIDATION] = PatternCategory.VALIDATION
96
+ allow_step_skipping: bool = Field(
97
+ default=False,
98
+ description="Whether users can skip steps",
99
+ )
100
+ allow_step_revisiting: bool = Field(
101
+ default=True,
102
+ description="Whether users can go back to previous steps",
103
+ )
104
+
105
+ def generate_code(self) -> str:
106
+ """Generate step validation code."""
107
+ return """
108
+ # Validate step sequence
109
+ submitted_step = step_data.get("step", current_step)
110
+
111
+ if submitted_step != current_step:
112
+ raise HTTPException(
113
+ status_code=422,
114
+ detail=f"Expected step {current_step}, got step {submitted_step}"
115
+ )
116
+
117
+ if submitted_step < 1 or submitted_step > total_steps:
118
+ raise HTTPException(
119
+ status_code=400,
120
+ detail=f"Step must be between 1 and {total_steps}"
121
+ )
122
+ """
123
+
124
+
125
+ class ApprovalPattern(BasePattern, CodeGeneratorMixin):
126
+ """User approval before finalization pattern.
127
+
128
+ **Description:**
129
+ Critical wizards require explicit user approval before finalizing output.
130
+ This follows a Preview → Approve → Finalize workflow.
131
+
132
+ **Usage:** 16 wizards (all healthcare wizards)
133
+ **Reusability:** 0.95
134
+
135
+ **Workflow:**
136
+ 1. User completes all steps
137
+ 2. POST /preview - Generate preview (NOT finalized)
138
+ 3. User reviews preview
139
+ 4. POST /save with user_approved=True - Finalize
140
+
141
+ **Safety Guarantees:**
142
+ - Cannot save without preview
143
+ - Cannot save without explicit approval
144
+ - Preview generation never finalizes
145
+ """
146
+
147
+ category: Literal[PatternCategory.VALIDATION] = PatternCategory.VALIDATION
148
+ requires_preview: bool = Field(
149
+ default=True,
150
+ description="Whether preview is required before approval",
151
+ )
152
+ approval_field: str = Field(
153
+ default="user_approved",
154
+ description="Field name for approval boolean",
155
+ )
156
+ allow_edits_after_preview: bool = Field(
157
+ default=True,
158
+ description="Whether user can edit after previewing",
159
+ )
160
+
161
+ def generate_code(self) -> str:
162
+ """Generate save endpoint with approval check."""
163
+ return f'''
164
+ @router.post("/{{wizard_id}}/save")
165
+ async def save_report(wizard_id: str, approval_data: dict[str, Any]):
166
+ """Finalize report with user approval"""
167
+ session = await _get_session(wizard_id)
168
+ if not session:
169
+ raise HTTPException(404, "Wizard session not found")
170
+
171
+ # Verify preview was generated
172
+ if "preview_report" not in session:
173
+ raise HTTPException(
174
+ 400,
175
+ "Must generate preview before saving. Call /preview endpoint first."
176
+ )
177
+
178
+ # Verify user explicitly approved
179
+ if not approval_data.get("{self.approval_field}", False):
180
+ raise HTTPException(
181
+ 400,
182
+ "User approval required. Set '{self.approval_field}': true"
183
+ )
184
+
185
+ # NOW we mark as complete
186
+ session["completed"] = True
187
+ session["completed_at"] = datetime.now().isoformat()
188
+ session["final_report"] = session["preview_report"]
189
+ session["{self.approval_field}"] = True
190
+
191
+ await _store_session(wizard_id, session)
192
+
193
+ return {{"report": session["final_report"], "completed": True}}
194
+ '''
coach_wizards/__init__.py DELETED
@@ -1,45 +0,0 @@
1
- """Coach Wizards - 17 Specialized Software Development Wizards
2
-
3
- Level 4 Anticipatory Empathy for software development using the Empathy Framework.
4
-
5
- Copyright 2025 Smart AI Memory, LLC
6
- Licensed under Fair Source 0.9
7
- """
8
-
9
- from .accessibility_wizard import AccessibilityWizard
10
- from .api_wizard import APIWizard
11
- from .cicd_wizard import CICDWizard
12
- from .compliance_wizard import ComplianceWizard
13
- from .database_wizard import DatabaseWizard
14
- from .debugging_wizard import DebuggingWizard
15
- from .documentation_wizard import DocumentationWizard
16
- from .localization_wizard import LocalizationWizard
17
- from .migration_wizard import MigrationWizard
18
- from .monitoring_wizard import MonitoringWizard
19
- from .observability_wizard import ObservabilityWizard
20
- from .performance_wizard import PerformanceWizard
21
- from .prompt_engineering_wizard import PromptEngineeringWizard
22
- from .refactoring_wizard import RefactoringWizard
23
- from .scaling_wizard import ScalingWizard
24
- from .security_wizard import SecurityWizard
25
- from .testing_wizard import TestingWizard
26
-
27
- __all__ = [
28
- "APIWizard",
29
- "AccessibilityWizard",
30
- "CICDWizard",
31
- "ComplianceWizard",
32
- "DatabaseWizard",
33
- "DebuggingWizard",
34
- "DocumentationWizard",
35
- "LocalizationWizard",
36
- "MigrationWizard",
37
- "MonitoringWizard",
38
- "ObservabilityWizard",
39
- "PerformanceWizard",
40
- "PromptEngineeringWizard",
41
- "RefactoringWizard",
42
- "ScalingWizard",
43
- "SecurityWizard",
44
- "TestingWizard",
45
- ]