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.
- empathy_framework-4.7.1.dist-info/METADATA +690 -0
- empathy_framework-4.7.1.dist-info/RECORD +379 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/top_level.txt +1 -2
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
- empathy_llm_toolkit/agent_factory/__init__.py +6 -6
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
- empathy_llm_toolkit/agents_md/__init__.py +22 -0
- empathy_llm_toolkit/agents_md/loader.py +218 -0
- empathy_llm_toolkit/agents_md/parser.py +271 -0
- empathy_llm_toolkit/agents_md/registry.py +307 -0
- empathy_llm_toolkit/commands/__init__.py +51 -0
- empathy_llm_toolkit/commands/context.py +375 -0
- empathy_llm_toolkit/commands/loader.py +301 -0
- empathy_llm_toolkit/commands/models.py +231 -0
- empathy_llm_toolkit/commands/parser.py +371 -0
- empathy_llm_toolkit/commands/registry.py +429 -0
- empathy_llm_toolkit/config/__init__.py +8 -8
- empathy_llm_toolkit/config/unified.py +3 -7
- empathy_llm_toolkit/context/__init__.py +22 -0
- empathy_llm_toolkit/context/compaction.py +455 -0
- empathy_llm_toolkit/context/manager.py +434 -0
- empathy_llm_toolkit/hooks/__init__.py +24 -0
- empathy_llm_toolkit/hooks/config.py +306 -0
- empathy_llm_toolkit/hooks/executor.py +289 -0
- empathy_llm_toolkit/hooks/registry.py +302 -0
- empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
- empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
- empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
- empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
- empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
- empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
- empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
- empathy_llm_toolkit/learning/__init__.py +30 -0
- empathy_llm_toolkit/learning/evaluator.py +438 -0
- empathy_llm_toolkit/learning/extractor.py +514 -0
- empathy_llm_toolkit/learning/storage.py +560 -0
- empathy_llm_toolkit/providers.py +4 -11
- empathy_llm_toolkit/security/__init__.py +17 -17
- empathy_llm_toolkit/utils/tokens.py +2 -5
- empathy_os/__init__.py +202 -70
- empathy_os/cache_monitor.py +5 -3
- empathy_os/cli/__init__.py +11 -55
- empathy_os/cli/__main__.py +29 -15
- empathy_os/cli/commands/inspection.py +21 -12
- empathy_os/cli/commands/memory.py +4 -12
- empathy_os/cli/commands/profiling.py +198 -0
- empathy_os/cli/commands/utilities.py +27 -7
- empathy_os/cli.py +28 -57
- empathy_os/cli_unified.py +525 -1164
- empathy_os/cost_tracker.py +9 -3
- empathy_os/dashboard/server.py +200 -2
- empathy_os/hot_reload/__init__.py +7 -7
- empathy_os/hot_reload/config.py +6 -7
- empathy_os/hot_reload/integration.py +35 -35
- empathy_os/hot_reload/reloader.py +57 -57
- empathy_os/hot_reload/watcher.py +28 -28
- empathy_os/hot_reload/websocket.py +2 -2
- empathy_os/memory/__init__.py +11 -4
- empathy_os/memory/claude_memory.py +1 -1
- empathy_os/memory/cross_session.py +8 -12
- empathy_os/memory/edges.py +6 -6
- empathy_os/memory/file_session.py +770 -0
- empathy_os/memory/graph.py +30 -30
- empathy_os/memory/nodes.py +6 -6
- empathy_os/memory/short_term.py +15 -9
- empathy_os/memory/unified.py +606 -140
- empathy_os/meta_workflows/agent_creator.py +3 -9
- empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
- empathy_os/meta_workflows/form_engine.py +6 -18
- empathy_os/meta_workflows/intent_detector.py +64 -24
- empathy_os/meta_workflows/models.py +3 -1
- empathy_os/meta_workflows/pattern_learner.py +13 -31
- empathy_os/meta_workflows/plan_generator.py +55 -47
- empathy_os/meta_workflows/session_context.py +2 -3
- empathy_os/meta_workflows/workflow.py +20 -51
- empathy_os/models/cli.py +2 -2
- empathy_os/models/tasks.py +1 -2
- empathy_os/models/telemetry.py +4 -1
- empathy_os/models/token_estimator.py +3 -1
- empathy_os/monitoring/alerts.py +938 -9
- empathy_os/monitoring/alerts_cli.py +346 -183
- empathy_os/orchestration/execution_strategies.py +12 -29
- empathy_os/orchestration/pattern_learner.py +20 -26
- empathy_os/orchestration/real_tools.py +6 -15
- empathy_os/platform_utils.py +2 -1
- empathy_os/plugins/__init__.py +2 -2
- empathy_os/plugins/base.py +64 -64
- empathy_os/plugins/registry.py +32 -32
- empathy_os/project_index/index.py +49 -15
- empathy_os/project_index/models.py +1 -2
- empathy_os/project_index/reports.py +1 -1
- empathy_os/project_index/scanner.py +1 -0
- empathy_os/redis_memory.py +10 -7
- empathy_os/resilience/__init__.py +1 -1
- empathy_os/resilience/health.py +10 -10
- empathy_os/routing/__init__.py +7 -7
- empathy_os/routing/chain_executor.py +37 -37
- empathy_os/routing/classifier.py +36 -36
- empathy_os/routing/smart_router.py +40 -40
- empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
- empathy_os/scaffolding/__init__.py +8 -8
- empathy_os/scaffolding/__main__.py +1 -1
- empathy_os/scaffolding/cli.py +28 -28
- empathy_os/socratic/__init__.py +3 -19
- empathy_os/socratic/ab_testing.py +25 -36
- empathy_os/socratic/blueprint.py +38 -38
- empathy_os/socratic/cli.py +34 -20
- empathy_os/socratic/collaboration.py +30 -28
- empathy_os/socratic/domain_templates.py +9 -1
- empathy_os/socratic/embeddings.py +17 -13
- empathy_os/socratic/engine.py +135 -70
- empathy_os/socratic/explainer.py +70 -60
- empathy_os/socratic/feedback.py +24 -19
- empathy_os/socratic/forms.py +15 -10
- empathy_os/socratic/generator.py +51 -35
- empathy_os/socratic/llm_analyzer.py +25 -23
- empathy_os/socratic/mcp_server.py +99 -159
- empathy_os/socratic/session.py +19 -13
- empathy_os/socratic/storage.py +98 -67
- empathy_os/socratic/success.py +38 -27
- empathy_os/socratic/visual_editor.py +51 -39
- empathy_os/socratic/web_ui.py +99 -66
- empathy_os/telemetry/cli.py +3 -1
- empathy_os/telemetry/usage_tracker.py +1 -3
- empathy_os/test_generator/__init__.py +3 -3
- empathy_os/test_generator/cli.py +28 -28
- empathy_os/test_generator/generator.py +64 -66
- empathy_os/test_generator/risk_analyzer.py +11 -11
- empathy_os/vscode_bridge 2.py +173 -0
- empathy_os/vscode_bridge.py +173 -0
- empathy_os/workflows/__init__.py +212 -120
- empathy_os/workflows/batch_processing.py +8 -24
- empathy_os/workflows/bug_predict.py +1 -1
- empathy_os/workflows/code_review.py +20 -5
- empathy_os/workflows/code_review_pipeline.py +13 -8
- empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
- empathy_os/workflows/manage_documentation.py +1 -0
- empathy_os/workflows/orchestrated_health_check.py +6 -11
- empathy_os/workflows/orchestrated_release_prep.py +3 -3
- empathy_os/workflows/pr_review.py +18 -10
- empathy_os/workflows/progressive/README 2.md +454 -0
- empathy_os/workflows/progressive/__init__ 2.py +92 -0
- empathy_os/workflows/progressive/__init__.py +2 -12
- empathy_os/workflows/progressive/cli 2.py +242 -0
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core 2.py +488 -0
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator 2.py +701 -0
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports 2.py +528 -0
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry 2.py +280 -0
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen 2.py +514 -0
- empathy_os/workflows/progressive/test_gen.py +29 -48
- empathy_os/workflows/progressive/workflow 2.py +628 -0
- empathy_os/workflows/progressive/workflow.py +31 -70
- empathy_os/workflows/release_prep.py +21 -6
- empathy_os/workflows/release_prep_crew.py +1 -0
- empathy_os/workflows/secure_release.py +13 -6
- empathy_os/workflows/security_audit.py +8 -3
- empathy_os/workflows/test_coverage_boost_crew.py +3 -2
- empathy_os/workflows/test_maintenance_crew.py +1 -0
- empathy_os/workflows/test_runner.py +16 -12
- empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
- empathy_software_plugin/cli.py +0 -122
- patterns/README.md +119 -0
- patterns/__init__.py +95 -0
- patterns/behavior.py +298 -0
- patterns/code_review_memory.json +441 -0
- patterns/core.py +97 -0
- patterns/debugging.json +3763 -0
- patterns/empathy.py +268 -0
- patterns/health_check_memory.json +505 -0
- patterns/input.py +161 -0
- patterns/memory_graph.json +8 -0
- patterns/refactoring_memory.json +1113 -0
- patterns/registry.py +663 -0
- patterns/security_memory.json +8 -0
- patterns/structural.py +415 -0
- patterns/validation.py +194 -0
- coach_wizards/__init__.py +0 -45
- coach_wizards/accessibility_wizard.py +0 -91
- coach_wizards/api_wizard.py +0 -91
- coach_wizards/base_wizard.py +0 -209
- coach_wizards/cicd_wizard.py +0 -91
- coach_wizards/code_reviewer_README.md +0 -60
- coach_wizards/code_reviewer_wizard.py +0 -180
- coach_wizards/compliance_wizard.py +0 -91
- coach_wizards/database_wizard.py +0 -91
- coach_wizards/debugging_wizard.py +0 -91
- coach_wizards/documentation_wizard.py +0 -91
- coach_wizards/generate_wizards.py +0 -347
- coach_wizards/localization_wizard.py +0 -173
- coach_wizards/migration_wizard.py +0 -91
- coach_wizards/monitoring_wizard.py +0 -91
- coach_wizards/observability_wizard.py +0 -91
- coach_wizards/performance_wizard.py +0 -91
- coach_wizards/prompt_engineering_wizard.py +0 -661
- coach_wizards/refactoring_wizard.py +0 -91
- coach_wizards/scaling_wizard.py +0 -90
- coach_wizards/security_wizard.py +0 -92
- coach_wizards/testing_wizard.py +0 -91
- empathy_framework-4.6.6.dist-info/METADATA +0 -1597
- empathy_framework-4.6.6.dist-info/RECORD +0 -410
- empathy_llm_toolkit/wizards/__init__.py +0 -43
- empathy_llm_toolkit/wizards/base_wizard.py +0 -364
- empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
- empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
- empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
- empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
- empathy_os/wizard_factory_cli.py +0 -170
- empathy_software_plugin/wizards/__init__.py +0 -42
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
- empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
- empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
- empathy_software_plugin/wizards/base_wizard.py +0 -288
- empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
- empathy_software_plugin/wizards/code_review_wizard.py +0 -604
- empathy_software_plugin/wizards/debugging/__init__.py +0 -50
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
- empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
- empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
- empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
- empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
- empathy_software_plugin/wizards/debugging/verification.py +0 -369
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
- empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
- empathy_software_plugin/wizards/performance/__init__.py +0 -9
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
- empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
- empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
- empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
- empathy_software_plugin/wizards/security/__init__.py +0 -32
- empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
- empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
- empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
- empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
- empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
- empathy_software_plugin/wizards/testing/__init__.py +0 -27
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
- empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
- empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
- empathy_software_plugin/wizards/testing_wizard.py +0 -274
- wizards/__init__.py +0 -82
- wizards/admission_assessment_wizard.py +0 -644
- wizards/care_plan.py +0 -321
- wizards/clinical_assessment.py +0 -769
- wizards/discharge_planning.py +0 -77
- wizards/discharge_summary_wizard.py +0 -468
- wizards/dosage_calculation.py +0 -497
- wizards/incident_report_wizard.py +0 -454
- wizards/medication_reconciliation.py +0 -85
- wizards/nursing_assessment.py +0 -171
- wizards/patient_education.py +0 -654
- wizards/quality_improvement.py +0 -705
- wizards/sbar_report.py +0 -324
- wizards/sbar_wizard.py +0 -608
- wizards/shift_handoff_wizard.py +0 -535
- wizards/soap_note_wizard.py +0 -679
- wizards/treatment_plan.py +0 -15
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/entry_points.txt +0 -0
- {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
|
-
]
|