empathy-framework 2.4.0__py3-none-any.whl → 3.8.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- coach_wizards/__init__.py +13 -12
- coach_wizards/accessibility_wizard.py +12 -12
- coach_wizards/api_wizard.py +12 -12
- coach_wizards/base_wizard.py +26 -20
- coach_wizards/cicd_wizard.py +15 -13
- coach_wizards/code_reviewer_README.md +60 -0
- coach_wizards/code_reviewer_wizard.py +180 -0
- coach_wizards/compliance_wizard.py +12 -12
- coach_wizards/database_wizard.py +12 -12
- coach_wizards/debugging_wizard.py +12 -12
- coach_wizards/documentation_wizard.py +12 -12
- coach_wizards/generate_wizards.py +1 -2
- coach_wizards/localization_wizard.py +101 -19
- coach_wizards/migration_wizard.py +12 -12
- coach_wizards/monitoring_wizard.py +12 -12
- coach_wizards/observability_wizard.py +12 -12
- coach_wizards/performance_wizard.py +12 -12
- coach_wizards/prompt_engineering_wizard.py +661 -0
- coach_wizards/refactoring_wizard.py +12 -12
- coach_wizards/scaling_wizard.py +12 -12
- coach_wizards/security_wizard.py +12 -12
- coach_wizards/testing_wizard.py +12 -12
- empathy_framework-3.8.2.dist-info/METADATA +1176 -0
- empathy_framework-3.8.2.dist-info/RECORD +333 -0
- empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/top_level.txt +5 -1
- empathy_healthcare_plugin/__init__.py +1 -2
- empathy_healthcare_plugin/monitors/__init__.py +9 -0
- empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
- empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
- empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
- empathy_llm_toolkit/__init__.py +7 -7
- empathy_llm_toolkit/agent_factory/__init__.py +53 -0
- empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
- empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
- empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
- empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
- empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
- empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
- empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
- empathy_llm_toolkit/agent_factory/base.py +305 -0
- empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
- empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
- empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
- empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
- empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
- empathy_llm_toolkit/agent_factory/decorators.py +286 -0
- empathy_llm_toolkit/agent_factory/factory.py +558 -0
- empathy_llm_toolkit/agent_factory/framework.py +192 -0
- empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
- empathy_llm_toolkit/agent_factory/resilient.py +320 -0
- empathy_llm_toolkit/claude_memory.py +14 -15
- empathy_llm_toolkit/cli/__init__.py +8 -0
- empathy_llm_toolkit/cli/sync_claude.py +487 -0
- empathy_llm_toolkit/code_health.py +186 -28
- empathy_llm_toolkit/config/__init__.py +29 -0
- empathy_llm_toolkit/config/unified.py +295 -0
- empathy_llm_toolkit/contextual_patterns.py +11 -12
- empathy_llm_toolkit/core.py +168 -53
- empathy_llm_toolkit/git_pattern_extractor.py +17 -13
- empathy_llm_toolkit/levels.py +6 -13
- empathy_llm_toolkit/pattern_confidence.py +14 -18
- empathy_llm_toolkit/pattern_resolver.py +10 -12
- empathy_llm_toolkit/pattern_summary.py +16 -14
- empathy_llm_toolkit/providers.py +194 -28
- empathy_llm_toolkit/routing/__init__.py +32 -0
- empathy_llm_toolkit/routing/model_router.py +362 -0
- empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
- empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
- empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
- empathy_llm_toolkit/security/README.md +262 -0
- empathy_llm_toolkit/security/__init__.py +62 -0
- empathy_llm_toolkit/security/audit_logger.py +929 -0
- empathy_llm_toolkit/security/audit_logger_example.py +152 -0
- empathy_llm_toolkit/security/pii_scrubber.py +640 -0
- empathy_llm_toolkit/security/secrets_detector.py +678 -0
- empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
- empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
- empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
- empathy_llm_toolkit/session_status.py +20 -22
- empathy_llm_toolkit/state.py +28 -21
- empathy_llm_toolkit/wizards/__init__.py +38 -0
- empathy_llm_toolkit/wizards/base_wizard.py +364 -0
- empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
- empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
- empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
- empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
- empathy_os/__init__.py +125 -84
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/{monitoring.py → agent_monitoring.py} +28 -28
- empathy_os/cache/__init__.py +117 -0
- empathy_os/cache/base.py +166 -0
- empathy_os/cache/dependency_manager.py +253 -0
- empathy_os/cache/hash_only.py +248 -0
- empathy_os/cache/hybrid.py +390 -0
- empathy_os/cache/storage.py +282 -0
- empathy_os/cli.py +1516 -70
- empathy_os/cli_unified.py +597 -0
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/config.py +95 -37
- empathy_os/coordination.py +72 -68
- empathy_os/core.py +94 -107
- empathy_os/cost_tracker.py +74 -55
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/discovery.py +17 -14
- empathy_os/emergence.py +21 -22
- empathy_os/exceptions.py +18 -30
- empathy_os/feedback_loops.py +30 -33
- empathy_os/levels.py +32 -35
- empathy_os/leverage_points.py +31 -32
- empathy_os/logging_config.py +19 -16
- empathy_os/memory/__init__.py +195 -0
- empathy_os/memory/claude_memory.py +466 -0
- empathy_os/memory/config.py +224 -0
- empathy_os/memory/control_panel.py +1298 -0
- empathy_os/memory/edges.py +179 -0
- empathy_os/memory/graph.py +567 -0
- empathy_os/memory/long_term.py +1194 -0
- empathy_os/memory/nodes.py +179 -0
- empathy_os/memory/redis_bootstrap.py +540 -0
- empathy_os/memory/security/__init__.py +31 -0
- empathy_os/memory/security/audit_logger.py +930 -0
- empathy_os/memory/security/pii_scrubber.py +640 -0
- empathy_os/memory/security/secrets_detector.py +678 -0
- empathy_os/memory/short_term.py +2119 -0
- empathy_os/memory/storage/__init__.py +15 -0
- empathy_os/memory/summary_index.py +583 -0
- empathy_os/memory/unified.py +619 -0
- empathy_os/metrics/__init__.py +12 -0
- empathy_os/metrics/prompt_metrics.py +190 -0
- empathy_os/models/__init__.py +136 -0
- empathy_os/models/__main__.py +13 -0
- empathy_os/models/cli.py +655 -0
- empathy_os/models/empathy_executor.py +354 -0
- empathy_os/models/executor.py +252 -0
- empathy_os/models/fallback.py +671 -0
- empathy_os/models/provider_config.py +563 -0
- empathy_os/models/registry.py +382 -0
- empathy_os/models/tasks.py +302 -0
- empathy_os/models/telemetry.py +548 -0
- empathy_os/models/token_estimator.py +378 -0
- empathy_os/models/validation.py +274 -0
- empathy_os/monitoring/__init__.py +52 -0
- empathy_os/monitoring/alerts.py +23 -0
- empathy_os/monitoring/alerts_cli.py +268 -0
- empathy_os/monitoring/multi_backend.py +271 -0
- empathy_os/monitoring/otel_backend.py +363 -0
- empathy_os/optimization/__init__.py +19 -0
- empathy_os/optimization/context_optimizer.py +272 -0
- empathy_os/pattern_library.py +30 -29
- empathy_os/persistence.py +35 -37
- empathy_os/platform_utils.py +261 -0
- empathy_os/plugins/__init__.py +28 -0
- empathy_os/plugins/base.py +361 -0
- empathy_os/plugins/registry.py +268 -0
- empathy_os/project_index/__init__.py +30 -0
- empathy_os/project_index/cli.py +335 -0
- empathy_os/project_index/crew_integration.py +430 -0
- empathy_os/project_index/index.py +425 -0
- empathy_os/project_index/models.py +501 -0
- empathy_os/project_index/reports.py +473 -0
- empathy_os/project_index/scanner.py +538 -0
- empathy_os/prompts/__init__.py +61 -0
- empathy_os/prompts/config.py +77 -0
- empathy_os/prompts/context.py +177 -0
- empathy_os/prompts/parser.py +285 -0
- empathy_os/prompts/registry.py +313 -0
- empathy_os/prompts/templates.py +208 -0
- empathy_os/redis_config.py +144 -58
- empathy_os/redis_memory.py +79 -77
- empathy_os/resilience/__init__.py +56 -0
- empathy_os/resilience/circuit_breaker.py +256 -0
- empathy_os/resilience/fallback.py +179 -0
- empathy_os/resilience/health.py +300 -0
- empathy_os/resilience/retry.py +209 -0
- empathy_os/resilience/timeout.py +135 -0
- empathy_os/routing/__init__.py +43 -0
- empathy_os/routing/chain_executor.py +433 -0
- empathy_os/routing/classifier.py +217 -0
- empathy_os/routing/smart_router.py +234 -0
- empathy_os/routing/wizard_registry.py +307 -0
- empathy_os/templates.py +19 -14
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/trust_building.py +67 -58
- empathy_os/validation/__init__.py +19 -0
- empathy_os/validation/xml_validator.py +281 -0
- empathy_os/wizard_factory_cli.py +170 -0
- empathy_os/{workflows.py → workflow_commands.py} +131 -37
- empathy_os/workflows/__init__.py +360 -0
- empathy_os/workflows/base.py +1660 -0
- empathy_os/workflows/bug_predict.py +962 -0
- empathy_os/workflows/code_review.py +960 -0
- empathy_os/workflows/code_review_adapters.py +310 -0
- empathy_os/workflows/code_review_pipeline.py +720 -0
- empathy_os/workflows/config.py +600 -0
- empathy_os/workflows/dependency_check.py +648 -0
- empathy_os/workflows/document_gen.py +1069 -0
- empathy_os/workflows/documentation_orchestrator.py +1205 -0
- empathy_os/workflows/health_check.py +679 -0
- empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
- empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
- empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
- empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
- empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
- empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
- empathy_os/workflows/manage_documentation.py +804 -0
- empathy_os/workflows/new_sample_workflow1.py +146 -0
- empathy_os/workflows/new_sample_workflow1_README.md +150 -0
- empathy_os/workflows/perf_audit.py +687 -0
- empathy_os/workflows/pr_review.py +748 -0
- empathy_os/workflows/progress.py +445 -0
- empathy_os/workflows/progress_server.py +322 -0
- empathy_os/workflows/refactor_plan.py +693 -0
- empathy_os/workflows/release_prep.py +808 -0
- empathy_os/workflows/research_synthesis.py +404 -0
- empathy_os/workflows/secure_release.py +585 -0
- empathy_os/workflows/security_adapters.py +297 -0
- empathy_os/workflows/security_audit.py +1046 -0
- empathy_os/workflows/step_config.py +234 -0
- empathy_os/workflows/test5.py +125 -0
- empathy_os/workflows/test5_README.md +158 -0
- empathy_os/workflows/test_gen.py +1855 -0
- empathy_os/workflows/test_lifecycle.py +526 -0
- empathy_os/workflows/test_maintenance.py +626 -0
- empathy_os/workflows/test_maintenance_cli.py +590 -0
- empathy_os/workflows/test_maintenance_crew.py +821 -0
- empathy_os/workflows/xml_enhanced_crew.py +285 -0
- empathy_software_plugin/__init__.py +1 -2
- empathy_software_plugin/cli/__init__.py +120 -0
- empathy_software_plugin/cli/inspect.py +362 -0
- empathy_software_plugin/cli.py +49 -27
- empathy_software_plugin/plugin.py +4 -8
- empathy_software_plugin/wizards/__init__.py +42 -0
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
- empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
- empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
- empathy_software_plugin/wizards/base_wizard.py +288 -0
- empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
- empathy_software_plugin/wizards/code_review_wizard.py +606 -0
- empathy_software_plugin/wizards/debugging/__init__.py +50 -0
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
- empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
- empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
- empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
- empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
- empathy_software_plugin/wizards/debugging/verification.py +369 -0
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
- empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
- empathy_software_plugin/wizards/performance/__init__.py +9 -0
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
- empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
- empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
- empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
- empathy_software_plugin/wizards/security/__init__.py +32 -0
- empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
- empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
- empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
- empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
- empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
- empathy_software_plugin/wizards/testing/__init__.py +27 -0
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
- empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
- empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
- empathy_software_plugin/wizards/testing_wizard.py +274 -0
- hot_reload/README.md +473 -0
- hot_reload/__init__.py +62 -0
- hot_reload/config.py +84 -0
- hot_reload/integration.py +228 -0
- hot_reload/reloader.py +298 -0
- hot_reload/watcher.py +179 -0
- hot_reload/websocket.py +176 -0
- scaffolding/README.md +589 -0
- scaffolding/__init__.py +35 -0
- scaffolding/__main__.py +14 -0
- scaffolding/cli.py +240 -0
- test_generator/__init__.py +38 -0
- test_generator/__main__.py +14 -0
- test_generator/cli.py +226 -0
- test_generator/generator.py +325 -0
- test_generator/risk_analyzer.py +216 -0
- workflow_patterns/__init__.py +33 -0
- workflow_patterns/behavior.py +249 -0
- workflow_patterns/core.py +76 -0
- workflow_patterns/output.py +99 -0
- workflow_patterns/registry.py +255 -0
- workflow_patterns/structural.py +288 -0
- workflow_scaffolding/__init__.py +11 -0
- workflow_scaffolding/__main__.py +12 -0
- workflow_scaffolding/cli.py +206 -0
- workflow_scaffolding/generator.py +265 -0
- agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
- agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
- agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
- agents/compliance_anticipation_agent.py +0 -1427
- agents/epic_integration_wizard.py +0 -541
- agents/trust_building_behaviors.py +0 -891
- empathy_framework-2.4.0.dist-info/METADATA +0 -485
- empathy_framework-2.4.0.dist-info/RECORD +0 -102
- empathy_framework-2.4.0.dist-info/entry_points.txt +0 -6
- empathy_llm_toolkit/htmlcov/status.json +0 -1
- empathy_llm_toolkit/security/htmlcov/status.json +0 -1
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +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,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()
|