empathy-framework 3.2.3__py3-none-any.whl → 3.8.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- coach_wizards/__init__.py +11 -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 +22 -25
- 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.2.3.dist-info → empathy_framework-3.8.2.dist-info}/METADATA +513 -58
- empathy_framework-3.8.2.dist-info/RECORD +333 -0
- empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
- {empathy_framework-3.2.3.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 +177 -22
- 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 +51 -49
- empathy_llm_toolkit/git_pattern_extractor.py +16 -12
- 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 +13 -11
- 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 +18 -20
- empathy_llm_toolkit/state.py +20 -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 +76 -77
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/{monitoring.py → agent_monitoring.py} +27 -27
- 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 +515 -109
- empathy_os/cli_unified.py +189 -42
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/config.py +87 -36
- empathy_os/coordination.py +48 -54
- empathy_os/core.py +90 -99
- empathy_os/cost_tracker.py +20 -23
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/discovery.py +9 -11
- empathy_os/emergence.py +20 -21
- empathy_os/exceptions.py +18 -30
- empathy_os/feedback_loops.py +27 -30
- empathy_os/levels.py +31 -34
- empathy_os/leverage_points.py +27 -28
- empathy_os/logging_config.py +11 -12
- 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 +29 -28
- empathy_os/persistence.py +30 -34
- 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 +53 -56
- 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 +12 -11
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/trust_building.py +44 -36
- 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} +123 -31
- 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 +35 -26
- 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-3.2.3.dist-info/RECORD +0 -104
- empathy_framework-3.2.3.dist-info/entry_points.txt +0 -7
- empathy_llm_toolkit/htmlcov/status.json +0 -1
- empathy_llm_toolkit/security/htmlcov/status.json +0 -1
- {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
- {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
One-Command Workflows for Empathy Framework
|
|
1
|
+
"""One-Command Workflows for Empathy Framework
|
|
3
2
|
|
|
4
3
|
Power-user commands that automate common developer workflows:
|
|
5
4
|
- morning: Start-of-day briefing with patterns, debt, and focus areas
|
|
@@ -30,7 +29,7 @@ def _load_patterns(patterns_dir: str = "./patterns") -> dict[str, list]:
|
|
|
30
29
|
if not patterns_path.exists():
|
|
31
30
|
return patterns
|
|
32
31
|
|
|
33
|
-
for pattern_type in patterns
|
|
32
|
+
for pattern_type in patterns:
|
|
34
33
|
file_path = patterns_path / f"{pattern_type}.json"
|
|
35
34
|
if file_path.exists():
|
|
36
35
|
try:
|
|
@@ -68,7 +67,7 @@ def _save_stats(stats: dict, empathy_dir: str = ".empathy") -> None:
|
|
|
68
67
|
def _run_command(cmd: list, capture: bool = True) -> tuple:
|
|
69
68
|
"""Run a shell command and return (success, output)."""
|
|
70
69
|
try:
|
|
71
|
-
result = subprocess.run(cmd, capture_output=capture, text=True, timeout=300)
|
|
70
|
+
result = subprocess.run(cmd, check=False, capture_output=capture, text=True, timeout=300)
|
|
72
71
|
return result.returncode == 0, result.stdout + result.stderr
|
|
73
72
|
except subprocess.TimeoutExpired:
|
|
74
73
|
return False, "Command timed out"
|
|
@@ -97,19 +96,19 @@ def _get_tech_debt_trend(patterns_dir: str = "./patterns") -> str:
|
|
|
97
96
|
|
|
98
97
|
if recent > previous:
|
|
99
98
|
return "increasing"
|
|
100
|
-
|
|
99
|
+
if recent < previous:
|
|
101
100
|
return "decreasing"
|
|
102
|
-
|
|
103
|
-
return "stable"
|
|
101
|
+
return "stable"
|
|
104
102
|
except (OSError, json.JSONDecodeError, KeyError):
|
|
105
103
|
return "unknown"
|
|
106
104
|
|
|
107
105
|
|
|
108
106
|
def morning_workflow(
|
|
109
|
-
patterns_dir: str = "./patterns",
|
|
107
|
+
patterns_dir: str = "./patterns",
|
|
108
|
+
project_root: str = ".",
|
|
109
|
+
verbose: bool = False,
|
|
110
110
|
) -> int:
|
|
111
|
-
"""
|
|
112
|
-
Start-of-day developer briefing.
|
|
111
|
+
"""Start-of-day developer briefing.
|
|
113
112
|
|
|
114
113
|
Shows:
|
|
115
114
|
- Health check summary
|
|
@@ -231,7 +230,7 @@ def morning_workflow(
|
|
|
231
230
|
]
|
|
232
231
|
if investigating_bugs:
|
|
233
232
|
suggestions.append(
|
|
234
|
-
f"Resolve {len(investigating_bugs)} investigating bug(s) via 'empathy patterns resolve'"
|
|
233
|
+
f"Resolve {len(investigating_bugs)} investigating bug(s) via 'empathy patterns resolve'",
|
|
235
234
|
)
|
|
236
235
|
|
|
237
236
|
if trend == "increasing":
|
|
@@ -258,14 +257,93 @@ def morning_workflow(
|
|
|
258
257
|
return 0
|
|
259
258
|
|
|
260
259
|
|
|
260
|
+
def _run_tests_only(project_root: str = ".", verbose: bool = False) -> int:
|
|
261
|
+
"""Run tests only (used by ship --tests-only)."""
|
|
262
|
+
print("\n" + "=" * 60)
|
|
263
|
+
print(" TEST RESULTS")
|
|
264
|
+
print("=" * 60 + "\n")
|
|
265
|
+
|
|
266
|
+
# Try pytest first
|
|
267
|
+
success, output = _run_command(["python", "-m", "pytest", project_root, "-v", "--tb=short"])
|
|
268
|
+
|
|
269
|
+
if success:
|
|
270
|
+
print("All tests passed!")
|
|
271
|
+
print("\n" + "=" * 60 + "\n")
|
|
272
|
+
return 0
|
|
273
|
+
print("Test Results:")
|
|
274
|
+
print("-" * 40)
|
|
275
|
+
print(output)
|
|
276
|
+
print("\n" + "=" * 60 + "\n")
|
|
277
|
+
return 1
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def _run_security_only(project_root: str = ".", verbose: bool = False) -> int:
|
|
281
|
+
"""Run security checks only (used by ship --security-only)."""
|
|
282
|
+
print("\n" + "=" * 60)
|
|
283
|
+
print(" SECURITY SCAN")
|
|
284
|
+
print("=" * 60 + "\n")
|
|
285
|
+
|
|
286
|
+
issues = []
|
|
287
|
+
|
|
288
|
+
# Try bandit (Python security scanner)
|
|
289
|
+
print("1. Running Bandit security scan...")
|
|
290
|
+
success, output = _run_command(["bandit", "-r", project_root, "-ll", "-q"])
|
|
291
|
+
if success:
|
|
292
|
+
print(" PASS - No high/medium security issues")
|
|
293
|
+
elif "bandit" in output.lower() and "not found" in output.lower():
|
|
294
|
+
print(" SKIP - Bandit not installed (pip install bandit)")
|
|
295
|
+
else:
|
|
296
|
+
issue_count = output.count(">> Issue:")
|
|
297
|
+
issues.append(f"Bandit: {issue_count} security issues")
|
|
298
|
+
print(f" WARN - {issue_count} issues found")
|
|
299
|
+
if verbose:
|
|
300
|
+
print(output)
|
|
301
|
+
|
|
302
|
+
# Check for secrets in code
|
|
303
|
+
print("2. Checking for hardcoded secrets...")
|
|
304
|
+
success, output = _run_command(
|
|
305
|
+
["grep", "-rn", "--include=*.py", "password.*=.*['\"]", project_root],
|
|
306
|
+
)
|
|
307
|
+
if not success or not output.strip():
|
|
308
|
+
print(" PASS - No obvious hardcoded secrets")
|
|
309
|
+
else:
|
|
310
|
+
lines = len([line for line in output.split("\n") if line.strip()])
|
|
311
|
+
issues.append(f"Secrets: {lines} potential hardcoded secrets")
|
|
312
|
+
print(f" WARN - {lines} potential hardcoded values found")
|
|
313
|
+
|
|
314
|
+
# Check for .env files that might be committed
|
|
315
|
+
print("3. Checking for sensitive files...")
|
|
316
|
+
success, output = _run_command(["git", "ls-files", ".env", "*.pem", "*.key"])
|
|
317
|
+
if not output.strip():
|
|
318
|
+
print(" PASS - No sensitive files tracked")
|
|
319
|
+
else:
|
|
320
|
+
files = len([line for line in output.split("\n") if line.strip()])
|
|
321
|
+
issues.append(f"Files: {files} sensitive files in git")
|
|
322
|
+
print(f" WARN - {files} sensitive files tracked in git")
|
|
323
|
+
|
|
324
|
+
# Summary
|
|
325
|
+
print("\n" + "-" * 60)
|
|
326
|
+
if issues:
|
|
327
|
+
print("\nSECURITY ISSUES FOUND:")
|
|
328
|
+
for issue in issues:
|
|
329
|
+
print(f" - {issue}")
|
|
330
|
+
print("\n" + "=" * 60 + "\n")
|
|
331
|
+
return 1
|
|
332
|
+
|
|
333
|
+
print("\nNo security issues found!")
|
|
334
|
+
print("\n" + "=" * 60 + "\n")
|
|
335
|
+
return 0
|
|
336
|
+
|
|
337
|
+
|
|
261
338
|
def ship_workflow(
|
|
262
339
|
patterns_dir: str = "./patterns",
|
|
263
340
|
project_root: str = ".",
|
|
264
341
|
skip_sync: bool = False,
|
|
342
|
+
tests_only: bool = False,
|
|
343
|
+
security_only: bool = False,
|
|
265
344
|
verbose: bool = False,
|
|
266
345
|
) -> int:
|
|
267
|
-
"""
|
|
268
|
-
Pre-commit validation pipeline.
|
|
346
|
+
"""Pre-commit validation pipeline.
|
|
269
347
|
|
|
270
348
|
Runs:
|
|
271
349
|
1. empathy inspect (code analysis)
|
|
@@ -273,8 +351,23 @@ def ship_workflow(
|
|
|
273
351
|
3. empathy sync-claude (pattern sync)
|
|
274
352
|
4. Summary
|
|
275
353
|
|
|
354
|
+
Args:
|
|
355
|
+
patterns_dir: Path to patterns directory
|
|
356
|
+
project_root: Project root directory
|
|
357
|
+
skip_sync: Skip syncing patterns to Claude
|
|
358
|
+
tests_only: Run tests only (skip lint/format checks)
|
|
359
|
+
security_only: Run security checks only
|
|
360
|
+
verbose: Show detailed output
|
|
361
|
+
|
|
276
362
|
Returns exit code (0 = ready to ship, non-zero = issues found).
|
|
363
|
+
|
|
277
364
|
"""
|
|
365
|
+
if tests_only:
|
|
366
|
+
return _run_tests_only(project_root, verbose)
|
|
367
|
+
|
|
368
|
+
if security_only:
|
|
369
|
+
return _run_security_only(project_root, verbose)
|
|
370
|
+
|
|
278
371
|
print("\n" + "=" * 60)
|
|
279
372
|
print(" PRE-SHIP CHECKLIST")
|
|
280
373
|
print("=" * 60 + "\n")
|
|
@@ -289,7 +382,7 @@ def ship_workflow(
|
|
|
289
382
|
print(" PASS - No lint issues")
|
|
290
383
|
else:
|
|
291
384
|
issue_count = len(
|
|
292
|
-
[line for line in output.split("\n") if line.strip() and not line.startswith("Found")]
|
|
385
|
+
[line for line in output.split("\n") if line.strip() and not line.startswith("Found")],
|
|
293
386
|
)
|
|
294
387
|
issues.append(f"Lint: {issue_count} issues")
|
|
295
388
|
print(f" FAIL - {issue_count} issues found")
|
|
@@ -307,7 +400,7 @@ def ship_workflow(
|
|
|
307
400
|
line
|
|
308
401
|
for line in output.split("\n")
|
|
309
402
|
if "would be reformatted" in line.lower() or line.strip().endswith(".py")
|
|
310
|
-
]
|
|
403
|
+
],
|
|
311
404
|
)
|
|
312
405
|
warnings.append(f"Format: {files} files need formatting")
|
|
313
406
|
print(f" WARN - {files} files need formatting (run 'empathy fix-all')")
|
|
@@ -330,7 +423,7 @@ def ship_workflow(
|
|
|
330
423
|
success, output = _run_command(["git", "status", "--porcelain"])
|
|
331
424
|
if success:
|
|
332
425
|
staged = len(
|
|
333
|
-
[line for line in output.split("\n") if line.startswith(("A ", "M ", "D ", "R "))]
|
|
426
|
+
[line for line in output.split("\n") if line.startswith(("A ", "M ", "D ", "R "))],
|
|
334
427
|
)
|
|
335
428
|
unstaged = len([line for line in output.split("\n") if line.startswith((" M", " D", "??"))])
|
|
336
429
|
if staged > 0:
|
|
@@ -346,15 +439,14 @@ def ship_workflow(
|
|
|
346
439
|
print("5. Syncing patterns to Claude Code...")
|
|
347
440
|
# Import here to avoid circular imports
|
|
348
441
|
try:
|
|
349
|
-
from
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
result =
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
print(f" PASS - {result.get('patterns_synced', 0)} patterns synced")
|
|
442
|
+
from pathlib import Path
|
|
443
|
+
|
|
444
|
+
from empathy_llm_toolkit.cli.sync_claude import sync_patterns
|
|
445
|
+
|
|
446
|
+
result = sync_patterns(project_root=Path(), verbose=False)
|
|
447
|
+
synced_count = len(result.get("synced", []))
|
|
448
|
+
if synced_count > 0:
|
|
449
|
+
print(f" PASS - {synced_count} patterns synced")
|
|
358
450
|
else:
|
|
359
451
|
print(" SKIP - No patterns to sync")
|
|
360
452
|
except ImportError:
|
|
@@ -395,8 +487,7 @@ def ship_workflow(
|
|
|
395
487
|
|
|
396
488
|
|
|
397
489
|
def fix_all_workflow(project_root: str = ".", dry_run: bool = False, verbose: bool = False) -> int:
|
|
398
|
-
"""
|
|
399
|
-
Auto-fix all fixable issues.
|
|
490
|
+
"""Auto-fix all fixable issues.
|
|
400
491
|
|
|
401
492
|
Runs:
|
|
402
493
|
1. ruff --fix (lint fixes)
|
|
@@ -444,7 +535,7 @@ def fix_all_workflow(project_root: str = ".", dry_run: bool = False, verbose: bo
|
|
|
444
535
|
line
|
|
445
536
|
for line in output.split("\n")
|
|
446
537
|
if line.strip().endswith(".py") and "reformatted" in output.lower()
|
|
447
|
-
]
|
|
538
|
+
],
|
|
448
539
|
)
|
|
449
540
|
|
|
450
541
|
print(f" Formatted {formatted} files")
|
|
@@ -488,8 +579,7 @@ def learn_workflow(
|
|
|
488
579
|
watch: bool = False,
|
|
489
580
|
verbose: bool = False,
|
|
490
581
|
) -> int:
|
|
491
|
-
"""
|
|
492
|
-
Watch for bug fixes and extract patterns.
|
|
582
|
+
"""Watch for bug fixes and extract patterns.
|
|
493
583
|
|
|
494
584
|
Modes:
|
|
495
585
|
- analyze: Analyze recent commits for bug fix patterns
|
|
@@ -516,7 +606,7 @@ def learn_workflow(
|
|
|
516
606
|
|
|
517
607
|
# Get recent commits
|
|
518
608
|
success, output = _run_command(
|
|
519
|
-
["git", "log", f"-{commit_count}", "--oneline", "--format=%H|%s|%an|%ai"]
|
|
609
|
+
["git", "log", f"-{commit_count}", "--oneline", "--format=%H|%s|%an|%ai"],
|
|
520
610
|
)
|
|
521
611
|
|
|
522
612
|
if not success:
|
|
@@ -660,6 +750,8 @@ def cmd_ship(args):
|
|
|
660
750
|
patterns_dir=getattr(args, "patterns_dir", "./patterns"),
|
|
661
751
|
project_root=getattr(args, "project_root", "."),
|
|
662
752
|
skip_sync=getattr(args, "skip_sync", False),
|
|
753
|
+
tests_only=getattr(args, "tests_only", False),
|
|
754
|
+
security_only=getattr(args, "security_only", False),
|
|
663
755
|
verbose=getattr(args, "verbose", False),
|
|
664
756
|
)
|
|
665
757
|
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
"""Multi-Model Workflow Templates for Empathy Framework
|
|
2
|
+
|
|
3
|
+
Cost-optimized workflow patterns that leverage 3-tier model routing:
|
|
4
|
+
- Haiku (cheap): Summarization, classification, triage
|
|
5
|
+
- Sonnet (capable): Analysis, code generation, security review
|
|
6
|
+
- Opus (premium): Synthesis, architectural decisions, coordination
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
from empathy_os.workflows import ResearchSynthesisWorkflow
|
|
10
|
+
|
|
11
|
+
workflow = ResearchSynthesisWorkflow()
|
|
12
|
+
result = await workflow.execute(
|
|
13
|
+
sources=["doc1.md", "doc2.md"],
|
|
14
|
+
question="What are the key patterns?"
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
print(f"Cost: ${result.cost_report.total_cost:.4f}")
|
|
18
|
+
print(f"Saved: {result.cost_report.savings_percent:.1f}% vs premium-only")
|
|
19
|
+
|
|
20
|
+
Workflow Discovery:
|
|
21
|
+
Workflows can be discovered via entry points (pyproject.toml):
|
|
22
|
+
|
|
23
|
+
[project.entry-points."empathy.workflows"]
|
|
24
|
+
my-workflow = "my_package.workflows:MyWorkflow"
|
|
25
|
+
|
|
26
|
+
Then call discover_workflows() to load all registered workflows.
|
|
27
|
+
|
|
28
|
+
Copyright 2025 Smart-AI-Memory
|
|
29
|
+
Licensed under Fair Source License 0.9
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
import importlib.metadata
|
|
33
|
+
import importlib.util
|
|
34
|
+
import os
|
|
35
|
+
from typing import TYPE_CHECKING
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from .base import BaseWorkflow
|
|
39
|
+
|
|
40
|
+
from .base import (
|
|
41
|
+
PROVIDER_MODELS,
|
|
42
|
+
BaseWorkflow,
|
|
43
|
+
CostReport,
|
|
44
|
+
ModelProvider,
|
|
45
|
+
ModelTier,
|
|
46
|
+
WorkflowResult,
|
|
47
|
+
WorkflowStage,
|
|
48
|
+
get_workflow_stats,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
# New high-value workflows
|
|
52
|
+
from .bug_predict import BugPredictionWorkflow
|
|
53
|
+
from .code_review import CodeReviewWorkflow
|
|
54
|
+
|
|
55
|
+
# Code review crew integration (v3.1)
|
|
56
|
+
from .code_review_pipeline import CodeReviewPipeline, CodeReviewPipelineResult
|
|
57
|
+
from .config import DEFAULT_MODELS, ModelConfig, WorkflowConfig, create_example_config, get_model
|
|
58
|
+
from .dependency_check import DependencyCheckWorkflow
|
|
59
|
+
from .document_gen import DocumentGenerationWorkflow
|
|
60
|
+
from .documentation_orchestrator import DocumentationOrchestrator, OrchestratorResult
|
|
61
|
+
from .health_check import HealthCheckWorkflow
|
|
62
|
+
|
|
63
|
+
# Keyboard Conductor (v3.6) - keyboard shortcut generation
|
|
64
|
+
from .keyboard_shortcuts import KeyboardShortcutWorkflow
|
|
65
|
+
from .manage_documentation import ManageDocumentationCrew, ManageDocumentationCrewResult
|
|
66
|
+
from .perf_audit import PerformanceAuditWorkflow
|
|
67
|
+
from .pr_review import PRReviewResult, PRReviewWorkflow
|
|
68
|
+
from .refactor_plan import RefactorPlanWorkflow
|
|
69
|
+
from .release_prep import ReleasePreparationWorkflow
|
|
70
|
+
from .research_synthesis import ResearchSynthesisWorkflow
|
|
71
|
+
|
|
72
|
+
# Security crew integration (v3.0)
|
|
73
|
+
from .secure_release import SecureReleasePipeline, SecureReleaseResult
|
|
74
|
+
from .security_audit import SecurityAuditWorkflow
|
|
75
|
+
from .step_config import WorkflowStepConfig, steps_from_tier_map, validate_step_config
|
|
76
|
+
|
|
77
|
+
# User-generated workflows
|
|
78
|
+
from .test5 import Test5Workflow
|
|
79
|
+
from .test_gen import TestGenerationWorkflow
|
|
80
|
+
|
|
81
|
+
# Re-export CLI commands from workflow_commands.py
|
|
82
|
+
_parent_dir = os.path.dirname(os.path.dirname(__file__))
|
|
83
|
+
_workflows_module_path = os.path.join(_parent_dir, "workflow_commands.py")
|
|
84
|
+
|
|
85
|
+
# Initialize to None for type checking
|
|
86
|
+
cmd_morning = None
|
|
87
|
+
cmd_ship = None
|
|
88
|
+
cmd_fix_all = None
|
|
89
|
+
cmd_learn = None
|
|
90
|
+
|
|
91
|
+
if os.path.exists(_workflows_module_path):
|
|
92
|
+
_spec = importlib.util.spec_from_file_location("_workflows_cli", _workflows_module_path)
|
|
93
|
+
if _spec is not None and _spec.loader is not None:
|
|
94
|
+
_workflows_cli = importlib.util.module_from_spec(_spec)
|
|
95
|
+
_spec.loader.exec_module(_workflows_cli)
|
|
96
|
+
|
|
97
|
+
# Re-export CLI commands
|
|
98
|
+
cmd_morning = _workflows_cli.cmd_morning
|
|
99
|
+
cmd_ship = _workflows_cli.cmd_ship
|
|
100
|
+
cmd_fix_all = _workflows_cli.cmd_fix_all
|
|
101
|
+
cmd_learn = _workflows_cli.cmd_learn
|
|
102
|
+
|
|
103
|
+
# Default workflow registry (statically defined for backwards compatibility)
|
|
104
|
+
# Note: Some entries are composite pipelines, not direct BaseWorkflow subclasses
|
|
105
|
+
_DEFAULT_WORKFLOWS: dict[str, type] = {
|
|
106
|
+
# Core workflows
|
|
107
|
+
"code-review": CodeReviewWorkflow,
|
|
108
|
+
"doc-gen": DocumentGenerationWorkflow,
|
|
109
|
+
# Analysis workflows
|
|
110
|
+
"bug-predict": BugPredictionWorkflow,
|
|
111
|
+
"security-audit": SecurityAuditWorkflow,
|
|
112
|
+
"perf-audit": PerformanceAuditWorkflow,
|
|
113
|
+
# Generation workflows
|
|
114
|
+
"test-gen": TestGenerationWorkflow, # Enabled by default for test coverage
|
|
115
|
+
"refactor-plan": RefactorPlanWorkflow,
|
|
116
|
+
# Operational workflows
|
|
117
|
+
"dependency-check": DependencyCheckWorkflow,
|
|
118
|
+
"release-prep": ReleasePreparationWorkflow,
|
|
119
|
+
# Composite security pipeline (v3.0)
|
|
120
|
+
"secure-release": SecureReleasePipeline,
|
|
121
|
+
# Code review crew integration (v3.1)
|
|
122
|
+
"pro-review": CodeReviewPipeline,
|
|
123
|
+
"pr-review": PRReviewWorkflow,
|
|
124
|
+
# Health check crew integration (v3.1)
|
|
125
|
+
"health-check": HealthCheckWorkflow,
|
|
126
|
+
# Documentation management (v3.5)
|
|
127
|
+
"doc-orchestrator": DocumentationOrchestrator,
|
|
128
|
+
"manage-docs": ManageDocumentationCrew,
|
|
129
|
+
# Keyboard Conductor (v3.6) - keyboard shortcut generation
|
|
130
|
+
"keyboard-shortcuts": KeyboardShortcutWorkflow,
|
|
131
|
+
# User-generated workflows
|
|
132
|
+
"test5": Test5Workflow,
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
# Opt-in workflows - not included by default, must be explicitly enabled
|
|
136
|
+
# Currently empty - all workflows are enabled by default
|
|
137
|
+
# Use disabled_workflows in config to turn off specific workflows
|
|
138
|
+
_OPT_IN_WORKFLOWS: dict[str, type] = {}
|
|
139
|
+
|
|
140
|
+
# Workflow registry populated at module load
|
|
141
|
+
WORKFLOW_REGISTRY: dict[str, type[BaseWorkflow]] = {}
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def discover_workflows(
|
|
145
|
+
include_defaults: bool = True,
|
|
146
|
+
config: "WorkflowConfig | None" = None,
|
|
147
|
+
) -> dict[str, type[BaseWorkflow]]:
|
|
148
|
+
"""Discover workflows via entry points and config.
|
|
149
|
+
|
|
150
|
+
This function loads workflows registered as entry points under the
|
|
151
|
+
'empathy.workflows' group. This allows third-party packages to register
|
|
152
|
+
custom workflows that integrate with the Empathy Framework.
|
|
153
|
+
|
|
154
|
+
Workflow availability is controlled by:
|
|
155
|
+
1. Default workflows (always included unless disabled)
|
|
156
|
+
2. Opt-in workflows (test-gen) - must be explicitly enabled OR compliance_mode=hipaa
|
|
157
|
+
3. enabled_workflows config - explicitly enable specific workflows
|
|
158
|
+
4. disabled_workflows config - explicitly disable specific workflows
|
|
159
|
+
5. Entry point discovery - third-party workflows
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
include_defaults: Whether to include default built-in workflows
|
|
163
|
+
config: Optional WorkflowConfig for enabled/disabled workflows
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
Dictionary mapping workflow names to workflow classes
|
|
167
|
+
|
|
168
|
+
Example:
|
|
169
|
+
# In your pyproject.toml:
|
|
170
|
+
[project.entry-points."empathy.workflows"]
|
|
171
|
+
my-workflow = "my_package.workflows:MyCustomWorkflow"
|
|
172
|
+
|
|
173
|
+
# In your code:
|
|
174
|
+
from empathy_os.workflows import discover_workflows
|
|
175
|
+
workflows = discover_workflows()
|
|
176
|
+
MyWorkflow = workflows.get("my-workflow")
|
|
177
|
+
|
|
178
|
+
# With HIPAA mode (enables test-gen):
|
|
179
|
+
config = WorkflowConfig.load() # compliance_mode: hipaa
|
|
180
|
+
workflows = discover_workflows(config=config)
|
|
181
|
+
|
|
182
|
+
"""
|
|
183
|
+
discovered: dict[str, type[BaseWorkflow]] = {}
|
|
184
|
+
|
|
185
|
+
# Include default workflows if requested
|
|
186
|
+
if include_defaults:
|
|
187
|
+
discovered.update(_DEFAULT_WORKFLOWS)
|
|
188
|
+
|
|
189
|
+
# Add opt-in workflows based on config
|
|
190
|
+
if config is not None:
|
|
191
|
+
# HIPAA mode auto-enables healthcare workflows
|
|
192
|
+
if config.is_hipaa_mode():
|
|
193
|
+
discovered.update(_OPT_IN_WORKFLOWS)
|
|
194
|
+
|
|
195
|
+
# Explicitly enabled workflows
|
|
196
|
+
for workflow_name in config.enabled_workflows:
|
|
197
|
+
if workflow_name in _OPT_IN_WORKFLOWS:
|
|
198
|
+
discovered[workflow_name] = _OPT_IN_WORKFLOWS[workflow_name]
|
|
199
|
+
|
|
200
|
+
# Explicitly disabled workflows
|
|
201
|
+
for workflow_name in config.disabled_workflows:
|
|
202
|
+
discovered.pop(workflow_name, None)
|
|
203
|
+
|
|
204
|
+
# Discover via entry points
|
|
205
|
+
try:
|
|
206
|
+
eps = importlib.metadata.entry_points(group="empathy.workflows")
|
|
207
|
+
for ep in eps:
|
|
208
|
+
try:
|
|
209
|
+
workflow_cls = ep.load()
|
|
210
|
+
# Validate it's a proper workflow class
|
|
211
|
+
if isinstance(workflow_cls, type) and hasattr(workflow_cls, "execute"):
|
|
212
|
+
# Check if disabled in config
|
|
213
|
+
if config is None or ep.name not in config.disabled_workflows:
|
|
214
|
+
discovered[ep.name] = workflow_cls
|
|
215
|
+
except Exception:
|
|
216
|
+
# Skip invalid entry points silently
|
|
217
|
+
pass
|
|
218
|
+
except Exception:
|
|
219
|
+
# If entry point discovery fails, just use defaults
|
|
220
|
+
pass
|
|
221
|
+
|
|
222
|
+
return discovered
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def refresh_workflow_registry(config: "WorkflowConfig | None" = None) -> None:
|
|
226
|
+
"""Refresh the global WORKFLOW_REGISTRY by re-discovering all workflows.
|
|
227
|
+
|
|
228
|
+
Call this after installing new packages that register workflows,
|
|
229
|
+
or after changing the WorkflowConfig (e.g., enabling HIPAA mode).
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
config: Optional WorkflowConfig for enabled/disabled workflows
|
|
233
|
+
|
|
234
|
+
"""
|
|
235
|
+
global WORKFLOW_REGISTRY
|
|
236
|
+
WORKFLOW_REGISTRY.clear()
|
|
237
|
+
WORKFLOW_REGISTRY.update(discover_workflows(config=config))
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def get_opt_in_workflows() -> dict[str, type]:
|
|
241
|
+
"""Get the list of opt-in workflows that require explicit enabling.
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
Dictionary of workflow name to class for opt-in workflows
|
|
245
|
+
|
|
246
|
+
"""
|
|
247
|
+
return dict(_OPT_IN_WORKFLOWS)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
# Initialize registry on module load
|
|
251
|
+
WORKFLOW_REGISTRY.update(discover_workflows())
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def get_workflow(name: str) -> type[BaseWorkflow]:
|
|
255
|
+
"""Get a workflow class by name.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
name: Workflow name (e.g., "research", "code-review", "doc-gen")
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
Workflow class
|
|
262
|
+
|
|
263
|
+
Raises:
|
|
264
|
+
KeyError: If workflow not found
|
|
265
|
+
|
|
266
|
+
"""
|
|
267
|
+
if name not in WORKFLOW_REGISTRY:
|
|
268
|
+
available = ", ".join(WORKFLOW_REGISTRY.keys())
|
|
269
|
+
raise KeyError(f"Unknown workflow: {name}. Available: {available}")
|
|
270
|
+
return WORKFLOW_REGISTRY[name]
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def list_workflows() -> list[dict]:
|
|
274
|
+
"""List all available workflows with descriptions.
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
List of workflow info dicts
|
|
278
|
+
|
|
279
|
+
"""
|
|
280
|
+
workflows = []
|
|
281
|
+
for name, cls in WORKFLOW_REGISTRY.items():
|
|
282
|
+
# Handle both BaseWorkflow subclasses and composite pipelines
|
|
283
|
+
stages = getattr(cls, "stages", [])
|
|
284
|
+
tier_map = getattr(cls, "tier_map", {})
|
|
285
|
+
description = getattr(cls, "description", "No description")
|
|
286
|
+
|
|
287
|
+
workflows.append(
|
|
288
|
+
{
|
|
289
|
+
"name": name,
|
|
290
|
+
"class": cls.__name__,
|
|
291
|
+
"description": description,
|
|
292
|
+
"stages": stages,
|
|
293
|
+
"tier_map": {k: v.value for k, v in tier_map.items()} if tier_map else {},
|
|
294
|
+
},
|
|
295
|
+
)
|
|
296
|
+
return workflows
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
__all__ = [
|
|
300
|
+
"DEFAULT_MODELS",
|
|
301
|
+
"PROVIDER_MODELS",
|
|
302
|
+
# Registry and discovery
|
|
303
|
+
"WORKFLOW_REGISTRY",
|
|
304
|
+
# Base classes
|
|
305
|
+
"BaseWorkflow",
|
|
306
|
+
# New high-value workflows
|
|
307
|
+
"BugPredictionWorkflow",
|
|
308
|
+
# Code review crew integration (v3.1)
|
|
309
|
+
"CodeReviewPipeline",
|
|
310
|
+
"CodeReviewPipelineResult",
|
|
311
|
+
"CodeReviewWorkflow",
|
|
312
|
+
"CostReport",
|
|
313
|
+
"DependencyCheckWorkflow",
|
|
314
|
+
"DocumentGenerationWorkflow",
|
|
315
|
+
# Documentation management (v3.5)
|
|
316
|
+
"DocumentationOrchestrator",
|
|
317
|
+
# Health check crew integration (v3.1)
|
|
318
|
+
"HealthCheckWorkflow",
|
|
319
|
+
# Keyboard Conductor (v3.6)
|
|
320
|
+
"KeyboardShortcutWorkflow",
|
|
321
|
+
"ManageDocumentationCrew",
|
|
322
|
+
"ManageDocumentationCrewResult",
|
|
323
|
+
"ModelConfig",
|
|
324
|
+
"ModelProvider",
|
|
325
|
+
"ModelTier",
|
|
326
|
+
"OrchestratorResult",
|
|
327
|
+
"PRReviewResult",
|
|
328
|
+
"PRReviewWorkflow",
|
|
329
|
+
"PerformanceAuditWorkflow",
|
|
330
|
+
"RefactorPlanWorkflow",
|
|
331
|
+
"ReleasePreparationWorkflow",
|
|
332
|
+
# Workflow implementations
|
|
333
|
+
"ResearchSynthesisWorkflow",
|
|
334
|
+
# Security crew integration (v3.0)
|
|
335
|
+
"SecureReleasePipeline",
|
|
336
|
+
"SecureReleaseResult",
|
|
337
|
+
"SecurityAuditWorkflow",
|
|
338
|
+
"TestGenerationWorkflow",
|
|
339
|
+
# Configuration
|
|
340
|
+
"WorkflowConfig",
|
|
341
|
+
"WorkflowResult",
|
|
342
|
+
"WorkflowStage",
|
|
343
|
+
# Step configuration (new)
|
|
344
|
+
"WorkflowStepConfig",
|
|
345
|
+
"cmd_fix_all",
|
|
346
|
+
"cmd_learn",
|
|
347
|
+
# CLI commands (re-exported from workflow_commands.py)
|
|
348
|
+
"cmd_morning",
|
|
349
|
+
"cmd_ship",
|
|
350
|
+
"create_example_config",
|
|
351
|
+
"discover_workflows",
|
|
352
|
+
"get_model",
|
|
353
|
+
"get_workflow",
|
|
354
|
+
# Stats for dashboard
|
|
355
|
+
"get_workflow_stats",
|
|
356
|
+
"list_workflows",
|
|
357
|
+
"refresh_workflow_registry",
|
|
358
|
+
"steps_from_tier_map",
|
|
359
|
+
"validate_step_config",
|
|
360
|
+
]
|