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,170 @@
|
|
|
1
|
+
"""Wizard Factory CLI integration for Empathy Framework.
|
|
2
|
+
|
|
3
|
+
Provides wizard-factory commands integrated into the main empathy CLI:
|
|
4
|
+
- empathy wizard-factory create
|
|
5
|
+
- empathy wizard-factory list-patterns
|
|
6
|
+
- empathy wizard-factory generate-tests
|
|
7
|
+
- empathy wizard-factory analyze
|
|
8
|
+
|
|
9
|
+
Copyright 2025 Smart AI Memory, LLC
|
|
10
|
+
Licensed under Fair Source 0.9
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import subprocess
|
|
14
|
+
import sys
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def cmd_wizard_factory_create(args):
|
|
18
|
+
"""Create a new wizard using scaffolding."""
|
|
19
|
+
# Build command
|
|
20
|
+
cmd = ["python", "-m", "scaffolding", "create", args.name]
|
|
21
|
+
|
|
22
|
+
if args.domain:
|
|
23
|
+
cmd.extend(["--domain", args.domain])
|
|
24
|
+
|
|
25
|
+
if args.type:
|
|
26
|
+
cmd.extend(["--type", args.type])
|
|
27
|
+
|
|
28
|
+
if args.methodology:
|
|
29
|
+
cmd.extend(["--methodology", args.methodology])
|
|
30
|
+
|
|
31
|
+
if args.patterns:
|
|
32
|
+
cmd.extend(["--patterns", args.patterns])
|
|
33
|
+
|
|
34
|
+
if args.interactive:
|
|
35
|
+
cmd.append("--interactive")
|
|
36
|
+
|
|
37
|
+
# Run scaffolding
|
|
38
|
+
result = subprocess.run(cmd)
|
|
39
|
+
sys.exit(result.returncode)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def cmd_wizard_factory_list_patterns(args):
|
|
43
|
+
"""List available patterns."""
|
|
44
|
+
result = subprocess.run(["python", "-m", "scaffolding", "list-patterns"])
|
|
45
|
+
sys.exit(result.returncode)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def cmd_wizard_factory_generate_tests(args):
|
|
49
|
+
"""Generate tests for a wizard."""
|
|
50
|
+
cmd = ["python", "-m", "test_generator", "generate", args.wizard_id]
|
|
51
|
+
|
|
52
|
+
if args.patterns:
|
|
53
|
+
cmd.extend(["--patterns", args.patterns])
|
|
54
|
+
|
|
55
|
+
if args.output:
|
|
56
|
+
cmd.extend(["--output", args.output])
|
|
57
|
+
|
|
58
|
+
result = subprocess.run(cmd)
|
|
59
|
+
sys.exit(result.returncode)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def cmd_wizard_factory_analyze(args):
|
|
63
|
+
"""Analyze wizard risk."""
|
|
64
|
+
cmd = ["python", "-m", "test_generator", "analyze", args.wizard_id]
|
|
65
|
+
|
|
66
|
+
if args.patterns:
|
|
67
|
+
cmd.extend(["--patterns", args.patterns])
|
|
68
|
+
|
|
69
|
+
if args.json:
|
|
70
|
+
cmd.append("--json")
|
|
71
|
+
|
|
72
|
+
result = subprocess.run(cmd)
|
|
73
|
+
sys.exit(result.returncode)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def add_wizard_factory_commands(subparsers):
|
|
77
|
+
"""Add wizard-factory commands to main CLI.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
subparsers: ArgumentParser subparsers object
|
|
81
|
+
"""
|
|
82
|
+
# Main wizard-factory command
|
|
83
|
+
parser_wf = subparsers.add_parser(
|
|
84
|
+
"wizard-factory",
|
|
85
|
+
help="Wizard Factory - create wizards 12x faster",
|
|
86
|
+
)
|
|
87
|
+
wf_subparsers = parser_wf.add_subparsers(dest="wizard_factory_command")
|
|
88
|
+
|
|
89
|
+
# wizard-factory create
|
|
90
|
+
parser_wf_create = wf_subparsers.add_parser(
|
|
91
|
+
"create",
|
|
92
|
+
help="Create a new wizard",
|
|
93
|
+
)
|
|
94
|
+
parser_wf_create.add_argument("name", help="Wizard name (snake_case)")
|
|
95
|
+
parser_wf_create.add_argument(
|
|
96
|
+
"--domain",
|
|
97
|
+
"-d",
|
|
98
|
+
help="Domain (healthcare, finance, software, legal, etc.)",
|
|
99
|
+
)
|
|
100
|
+
parser_wf_create.add_argument(
|
|
101
|
+
"--type",
|
|
102
|
+
"-t",
|
|
103
|
+
choices=["domain", "coach", "ai"],
|
|
104
|
+
default="domain",
|
|
105
|
+
help="Wizard type (default: domain)",
|
|
106
|
+
)
|
|
107
|
+
parser_wf_create.add_argument(
|
|
108
|
+
"--methodology",
|
|
109
|
+
"-m",
|
|
110
|
+
choices=["pattern", "tdd"],
|
|
111
|
+
default="pattern",
|
|
112
|
+
help="Methodology (pattern-compose or tdd-first, default: pattern)",
|
|
113
|
+
)
|
|
114
|
+
parser_wf_create.add_argument(
|
|
115
|
+
"--patterns",
|
|
116
|
+
"-p",
|
|
117
|
+
help="Comma-separated pattern IDs (e.g. linear_flow,approval)",
|
|
118
|
+
)
|
|
119
|
+
parser_wf_create.add_argument(
|
|
120
|
+
"--interactive",
|
|
121
|
+
"-i",
|
|
122
|
+
action="store_true",
|
|
123
|
+
help="Interactive pattern selection",
|
|
124
|
+
)
|
|
125
|
+
parser_wf_create.set_defaults(func=cmd_wizard_factory_create)
|
|
126
|
+
|
|
127
|
+
# wizard-factory list-patterns
|
|
128
|
+
parser_wf_list = wf_subparsers.add_parser(
|
|
129
|
+
"list-patterns",
|
|
130
|
+
help="List available patterns",
|
|
131
|
+
)
|
|
132
|
+
parser_wf_list.set_defaults(func=cmd_wizard_factory_list_patterns)
|
|
133
|
+
|
|
134
|
+
# wizard-factory generate-tests
|
|
135
|
+
parser_wf_gen = wf_subparsers.add_parser(
|
|
136
|
+
"generate-tests",
|
|
137
|
+
help="Generate tests for a wizard",
|
|
138
|
+
)
|
|
139
|
+
parser_wf_gen.add_argument("wizard_id", help="Wizard ID")
|
|
140
|
+
parser_wf_gen.add_argument(
|
|
141
|
+
"--patterns",
|
|
142
|
+
"-p",
|
|
143
|
+
required=True,
|
|
144
|
+
help="Comma-separated pattern IDs",
|
|
145
|
+
)
|
|
146
|
+
parser_wf_gen.add_argument(
|
|
147
|
+
"--output",
|
|
148
|
+
"-o",
|
|
149
|
+
help="Output directory for tests",
|
|
150
|
+
)
|
|
151
|
+
parser_wf_gen.set_defaults(func=cmd_wizard_factory_generate_tests)
|
|
152
|
+
|
|
153
|
+
# wizard-factory analyze
|
|
154
|
+
parser_wf_analyze = wf_subparsers.add_parser(
|
|
155
|
+
"analyze",
|
|
156
|
+
help="Analyze wizard risk and get coverage recommendations",
|
|
157
|
+
)
|
|
158
|
+
parser_wf_analyze.add_argument("wizard_id", help="Wizard ID")
|
|
159
|
+
parser_wf_analyze.add_argument(
|
|
160
|
+
"--patterns",
|
|
161
|
+
"-p",
|
|
162
|
+
required=True,
|
|
163
|
+
help="Comma-separated pattern IDs",
|
|
164
|
+
)
|
|
165
|
+
parser_wf_analyze.add_argument(
|
|
166
|
+
"--json",
|
|
167
|
+
action="store_true",
|
|
168
|
+
help="Output JSON format",
|
|
169
|
+
)
|
|
170
|
+
parser_wf_analyze.set_defaults(func=cmd_wizard_factory_analyze)
|
|
@@ -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
|
|
@@ -15,21 +14,22 @@ import json
|
|
|
15
14
|
import subprocess
|
|
16
15
|
from datetime import datetime, timedelta
|
|
17
16
|
from pathlib import Path
|
|
17
|
+
from typing import Any
|
|
18
18
|
|
|
19
19
|
from empathy_os.logging_config import get_logger
|
|
20
20
|
|
|
21
21
|
logger = get_logger(__name__)
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
def _load_patterns(patterns_dir: str = "./patterns") -> dict:
|
|
24
|
+
def _load_patterns(patterns_dir: str = "./patterns") -> dict[str, list]:
|
|
25
25
|
"""Load patterns from the patterns directory."""
|
|
26
|
-
patterns = {"debugging": [], "security": [], "tech_debt": [], "inspection": []}
|
|
26
|
+
patterns: dict[str, list] = {"debugging": [], "security": [], "tech_debt": [], "inspection": []}
|
|
27
27
|
|
|
28
28
|
patterns_path = Path(patterns_dir)
|
|
29
29
|
if not patterns_path.exists():
|
|
30
30
|
return patterns
|
|
31
31
|
|
|
32
|
-
for pattern_type in patterns
|
|
32
|
+
for pattern_type in patterns:
|
|
33
33
|
file_path = patterns_path / f"{pattern_type}.json"
|
|
34
34
|
if file_path.exists():
|
|
35
35
|
try:
|
|
@@ -42,13 +42,14 @@ def _load_patterns(patterns_dir: str = "./patterns") -> dict:
|
|
|
42
42
|
return patterns
|
|
43
43
|
|
|
44
44
|
|
|
45
|
-
def _load_stats(empathy_dir: str = ".empathy") -> dict:
|
|
45
|
+
def _load_stats(empathy_dir: str = ".empathy") -> dict[str, Any]:
|
|
46
46
|
"""Load usage statistics."""
|
|
47
47
|
stats_file = Path(empathy_dir) / "stats.json"
|
|
48
48
|
if stats_file.exists():
|
|
49
49
|
try:
|
|
50
50
|
with open(stats_file) as f:
|
|
51
|
-
|
|
51
|
+
result: dict[str, Any] = json.load(f)
|
|
52
|
+
return result
|
|
52
53
|
except (OSError, json.JSONDecodeError):
|
|
53
54
|
pass
|
|
54
55
|
return {"commands": {}, "last_session": None, "patterns_learned": 0}
|
|
@@ -66,7 +67,7 @@ def _save_stats(stats: dict, empathy_dir: str = ".empathy") -> None:
|
|
|
66
67
|
def _run_command(cmd: list, capture: bool = True) -> tuple:
|
|
67
68
|
"""Run a shell command and return (success, output)."""
|
|
68
69
|
try:
|
|
69
|
-
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)
|
|
70
71
|
return result.returncode == 0, result.stdout + result.stderr
|
|
71
72
|
except subprocess.TimeoutExpired:
|
|
72
73
|
return False, "Command timed out"
|
|
@@ -95,19 +96,19 @@ def _get_tech_debt_trend(patterns_dir: str = "./patterns") -> str:
|
|
|
95
96
|
|
|
96
97
|
if recent > previous:
|
|
97
98
|
return "increasing"
|
|
98
|
-
|
|
99
|
+
if recent < previous:
|
|
99
100
|
return "decreasing"
|
|
100
|
-
|
|
101
|
-
return "stable"
|
|
101
|
+
return "stable"
|
|
102
102
|
except (OSError, json.JSONDecodeError, KeyError):
|
|
103
103
|
return "unknown"
|
|
104
104
|
|
|
105
105
|
|
|
106
106
|
def morning_workflow(
|
|
107
|
-
patterns_dir: str = "./patterns",
|
|
107
|
+
patterns_dir: str = "./patterns",
|
|
108
|
+
project_root: str = ".",
|
|
109
|
+
verbose: bool = False,
|
|
108
110
|
) -> int:
|
|
109
|
-
"""
|
|
110
|
-
Start-of-day developer briefing.
|
|
111
|
+
"""Start-of-day developer briefing.
|
|
111
112
|
|
|
112
113
|
Shows:
|
|
113
114
|
- Health check summary
|
|
@@ -154,9 +155,7 @@ def morning_workflow(
|
|
|
154
155
|
if recent_bugs:
|
|
155
156
|
print(f"\n New this week: {len(recent_bugs)} patterns")
|
|
156
157
|
for bug in recent_bugs[:3]:
|
|
157
|
-
print(
|
|
158
|
-
f" - {bug.get('bug_type', 'unknown')}: {bug.get('root_cause', 'investigating')[:50]}"
|
|
159
|
-
)
|
|
158
|
+
print(f" - {bug.get('bug_type', '?')}: {bug.get('root_cause', '?')[:40]}")
|
|
160
159
|
|
|
161
160
|
# 2. Tech debt trajectory
|
|
162
161
|
print("\n" + "TECH DEBT TRAJECTORY")
|
|
@@ -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)
|
|
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,13 +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
|
|
442
|
+
from pathlib import Path
|
|
350
443
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
)
|
|
354
|
-
|
|
355
|
-
|
|
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")
|
|
356
450
|
else:
|
|
357
451
|
print(" SKIP - No patterns to sync")
|
|
358
452
|
except ImportError:
|
|
@@ -393,8 +487,7 @@ def ship_workflow(
|
|
|
393
487
|
|
|
394
488
|
|
|
395
489
|
def fix_all_workflow(project_root: str = ".", dry_run: bool = False, verbose: bool = False) -> int:
|
|
396
|
-
"""
|
|
397
|
-
Auto-fix all fixable issues.
|
|
490
|
+
"""Auto-fix all fixable issues.
|
|
398
491
|
|
|
399
492
|
Runs:
|
|
400
493
|
1. ruff --fix (lint fixes)
|
|
@@ -442,7 +535,7 @@ def fix_all_workflow(project_root: str = ".", dry_run: bool = False, verbose: bo
|
|
|
442
535
|
line
|
|
443
536
|
for line in output.split("\n")
|
|
444
537
|
if line.strip().endswith(".py") and "reformatted" in output.lower()
|
|
445
|
-
]
|
|
538
|
+
],
|
|
446
539
|
)
|
|
447
540
|
|
|
448
541
|
print(f" Formatted {formatted} files")
|
|
@@ -486,8 +579,7 @@ def learn_workflow(
|
|
|
486
579
|
watch: bool = False,
|
|
487
580
|
verbose: bool = False,
|
|
488
581
|
) -> int:
|
|
489
|
-
"""
|
|
490
|
-
Watch for bug fixes and extract patterns.
|
|
582
|
+
"""Watch for bug fixes and extract patterns.
|
|
491
583
|
|
|
492
584
|
Modes:
|
|
493
585
|
- analyze: Analyze recent commits for bug fix patterns
|
|
@@ -514,7 +606,7 @@ def learn_workflow(
|
|
|
514
606
|
|
|
515
607
|
# Get recent commits
|
|
516
608
|
success, output = _run_command(
|
|
517
|
-
["git", "log", f"-{commit_count}", "--oneline", "--format=%H|%s|%an|%ai"]
|
|
609
|
+
["git", "log", f"-{commit_count}", "--oneline", "--format=%H|%s|%an|%ai"],
|
|
518
610
|
)
|
|
519
611
|
|
|
520
612
|
if not success:
|
|
@@ -594,7 +686,7 @@ def learn_workflow(
|
|
|
594
686
|
|
|
595
687
|
# Load existing patterns and merge
|
|
596
688
|
debugging_file = patterns_path / "debugging.json"
|
|
597
|
-
existing = {"patterns": []}
|
|
689
|
+
existing: dict[str, Any] = {"patterns": []}
|
|
598
690
|
|
|
599
691
|
if debugging_file.exists():
|
|
600
692
|
try:
|
|
@@ -622,7 +714,7 @@ def learn_workflow(
|
|
|
622
714
|
|
|
623
715
|
if learned:
|
|
624
716
|
print("\nBug types discovered:")
|
|
625
|
-
types = {}
|
|
717
|
+
types: dict[str, int] = {}
|
|
626
718
|
for p in learned:
|
|
627
719
|
t = p["bug_type"]
|
|
628
720
|
types[t] = types.get(t, 0) + 1
|
|
@@ -658,6 +750,8 @@ def cmd_ship(args):
|
|
|
658
750
|
patterns_dir=getattr(args, "patterns_dir", "./patterns"),
|
|
659
751
|
project_root=getattr(args, "project_root", "."),
|
|
660
752
|
skip_sync=getattr(args, "skip_sync", False),
|
|
753
|
+
tests_only=getattr(args, "tests_only", False),
|
|
754
|
+
security_only=getattr(args, "security_only", False),
|
|
661
755
|
verbose=getattr(args, "verbose", False),
|
|
662
756
|
)
|
|
663
757
|
|