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.
Files changed (329) hide show
  1. coach_wizards/__init__.py +13 -12
  2. coach_wizards/accessibility_wizard.py +12 -12
  3. coach_wizards/api_wizard.py +12 -12
  4. coach_wizards/base_wizard.py +26 -20
  5. coach_wizards/cicd_wizard.py +15 -13
  6. coach_wizards/code_reviewer_README.md +60 -0
  7. coach_wizards/code_reviewer_wizard.py +180 -0
  8. coach_wizards/compliance_wizard.py +12 -12
  9. coach_wizards/database_wizard.py +12 -12
  10. coach_wizards/debugging_wizard.py +12 -12
  11. coach_wizards/documentation_wizard.py +12 -12
  12. coach_wizards/generate_wizards.py +1 -2
  13. coach_wizards/localization_wizard.py +101 -19
  14. coach_wizards/migration_wizard.py +12 -12
  15. coach_wizards/monitoring_wizard.py +12 -12
  16. coach_wizards/observability_wizard.py +12 -12
  17. coach_wizards/performance_wizard.py +12 -12
  18. coach_wizards/prompt_engineering_wizard.py +661 -0
  19. coach_wizards/refactoring_wizard.py +12 -12
  20. coach_wizards/scaling_wizard.py +12 -12
  21. coach_wizards/security_wizard.py +12 -12
  22. coach_wizards/testing_wizard.py +12 -12
  23. empathy_framework-3.8.2.dist-info/METADATA +1176 -0
  24. empathy_framework-3.8.2.dist-info/RECORD +333 -0
  25. empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
  26. {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/top_level.txt +5 -1
  27. empathy_healthcare_plugin/__init__.py +1 -2
  28. empathy_healthcare_plugin/monitors/__init__.py +9 -0
  29. empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
  30. empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
  31. empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
  32. empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
  33. empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
  34. empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
  35. empathy_llm_toolkit/__init__.py +7 -7
  36. empathy_llm_toolkit/agent_factory/__init__.py +53 -0
  37. empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
  38. empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
  39. empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
  40. empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
  41. empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
  42. empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
  43. empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
  44. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
  45. empathy_llm_toolkit/agent_factory/base.py +305 -0
  46. empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
  47. empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
  48. empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
  49. empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
  50. empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
  51. empathy_llm_toolkit/agent_factory/decorators.py +286 -0
  52. empathy_llm_toolkit/agent_factory/factory.py +558 -0
  53. empathy_llm_toolkit/agent_factory/framework.py +192 -0
  54. empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
  55. empathy_llm_toolkit/agent_factory/resilient.py +320 -0
  56. empathy_llm_toolkit/claude_memory.py +14 -15
  57. empathy_llm_toolkit/cli/__init__.py +8 -0
  58. empathy_llm_toolkit/cli/sync_claude.py +487 -0
  59. empathy_llm_toolkit/code_health.py +186 -28
  60. empathy_llm_toolkit/config/__init__.py +29 -0
  61. empathy_llm_toolkit/config/unified.py +295 -0
  62. empathy_llm_toolkit/contextual_patterns.py +11 -12
  63. empathy_llm_toolkit/core.py +168 -53
  64. empathy_llm_toolkit/git_pattern_extractor.py +17 -13
  65. empathy_llm_toolkit/levels.py +6 -13
  66. empathy_llm_toolkit/pattern_confidence.py +14 -18
  67. empathy_llm_toolkit/pattern_resolver.py +10 -12
  68. empathy_llm_toolkit/pattern_summary.py +16 -14
  69. empathy_llm_toolkit/providers.py +194 -28
  70. empathy_llm_toolkit/routing/__init__.py +32 -0
  71. empathy_llm_toolkit/routing/model_router.py +362 -0
  72. empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
  73. empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
  74. empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  75. empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
  76. empathy_llm_toolkit/security/README.md +262 -0
  77. empathy_llm_toolkit/security/__init__.py +62 -0
  78. empathy_llm_toolkit/security/audit_logger.py +929 -0
  79. empathy_llm_toolkit/security/audit_logger_example.py +152 -0
  80. empathy_llm_toolkit/security/pii_scrubber.py +640 -0
  81. empathy_llm_toolkit/security/secrets_detector.py +678 -0
  82. empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
  83. empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
  84. empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
  85. empathy_llm_toolkit/session_status.py +20 -22
  86. empathy_llm_toolkit/state.py +28 -21
  87. empathy_llm_toolkit/wizards/__init__.py +38 -0
  88. empathy_llm_toolkit/wizards/base_wizard.py +364 -0
  89. empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
  90. empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
  91. empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
  92. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
  93. empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
  94. empathy_os/__init__.py +125 -84
  95. empathy_os/adaptive/__init__.py +13 -0
  96. empathy_os/adaptive/task_complexity.py +127 -0
  97. empathy_os/{monitoring.py → agent_monitoring.py} +28 -28
  98. empathy_os/cache/__init__.py +117 -0
  99. empathy_os/cache/base.py +166 -0
  100. empathy_os/cache/dependency_manager.py +253 -0
  101. empathy_os/cache/hash_only.py +248 -0
  102. empathy_os/cache/hybrid.py +390 -0
  103. empathy_os/cache/storage.py +282 -0
  104. empathy_os/cli.py +1516 -70
  105. empathy_os/cli_unified.py +597 -0
  106. empathy_os/config/__init__.py +63 -0
  107. empathy_os/config/xml_config.py +239 -0
  108. empathy_os/config.py +95 -37
  109. empathy_os/coordination.py +72 -68
  110. empathy_os/core.py +94 -107
  111. empathy_os/cost_tracker.py +74 -55
  112. empathy_os/dashboard/__init__.py +15 -0
  113. empathy_os/dashboard/server.py +743 -0
  114. empathy_os/discovery.py +17 -14
  115. empathy_os/emergence.py +21 -22
  116. empathy_os/exceptions.py +18 -30
  117. empathy_os/feedback_loops.py +30 -33
  118. empathy_os/levels.py +32 -35
  119. empathy_os/leverage_points.py +31 -32
  120. empathy_os/logging_config.py +19 -16
  121. empathy_os/memory/__init__.py +195 -0
  122. empathy_os/memory/claude_memory.py +466 -0
  123. empathy_os/memory/config.py +224 -0
  124. empathy_os/memory/control_panel.py +1298 -0
  125. empathy_os/memory/edges.py +179 -0
  126. empathy_os/memory/graph.py +567 -0
  127. empathy_os/memory/long_term.py +1194 -0
  128. empathy_os/memory/nodes.py +179 -0
  129. empathy_os/memory/redis_bootstrap.py +540 -0
  130. empathy_os/memory/security/__init__.py +31 -0
  131. empathy_os/memory/security/audit_logger.py +930 -0
  132. empathy_os/memory/security/pii_scrubber.py +640 -0
  133. empathy_os/memory/security/secrets_detector.py +678 -0
  134. empathy_os/memory/short_term.py +2119 -0
  135. empathy_os/memory/storage/__init__.py +15 -0
  136. empathy_os/memory/summary_index.py +583 -0
  137. empathy_os/memory/unified.py +619 -0
  138. empathy_os/metrics/__init__.py +12 -0
  139. empathy_os/metrics/prompt_metrics.py +190 -0
  140. empathy_os/models/__init__.py +136 -0
  141. empathy_os/models/__main__.py +13 -0
  142. empathy_os/models/cli.py +655 -0
  143. empathy_os/models/empathy_executor.py +354 -0
  144. empathy_os/models/executor.py +252 -0
  145. empathy_os/models/fallback.py +671 -0
  146. empathy_os/models/provider_config.py +563 -0
  147. empathy_os/models/registry.py +382 -0
  148. empathy_os/models/tasks.py +302 -0
  149. empathy_os/models/telemetry.py +548 -0
  150. empathy_os/models/token_estimator.py +378 -0
  151. empathy_os/models/validation.py +274 -0
  152. empathy_os/monitoring/__init__.py +52 -0
  153. empathy_os/monitoring/alerts.py +23 -0
  154. empathy_os/monitoring/alerts_cli.py +268 -0
  155. empathy_os/monitoring/multi_backend.py +271 -0
  156. empathy_os/monitoring/otel_backend.py +363 -0
  157. empathy_os/optimization/__init__.py +19 -0
  158. empathy_os/optimization/context_optimizer.py +272 -0
  159. empathy_os/pattern_library.py +30 -29
  160. empathy_os/persistence.py +35 -37
  161. empathy_os/platform_utils.py +261 -0
  162. empathy_os/plugins/__init__.py +28 -0
  163. empathy_os/plugins/base.py +361 -0
  164. empathy_os/plugins/registry.py +268 -0
  165. empathy_os/project_index/__init__.py +30 -0
  166. empathy_os/project_index/cli.py +335 -0
  167. empathy_os/project_index/crew_integration.py +430 -0
  168. empathy_os/project_index/index.py +425 -0
  169. empathy_os/project_index/models.py +501 -0
  170. empathy_os/project_index/reports.py +473 -0
  171. empathy_os/project_index/scanner.py +538 -0
  172. empathy_os/prompts/__init__.py +61 -0
  173. empathy_os/prompts/config.py +77 -0
  174. empathy_os/prompts/context.py +177 -0
  175. empathy_os/prompts/parser.py +285 -0
  176. empathy_os/prompts/registry.py +313 -0
  177. empathy_os/prompts/templates.py +208 -0
  178. empathy_os/redis_config.py +144 -58
  179. empathy_os/redis_memory.py +79 -77
  180. empathy_os/resilience/__init__.py +56 -0
  181. empathy_os/resilience/circuit_breaker.py +256 -0
  182. empathy_os/resilience/fallback.py +179 -0
  183. empathy_os/resilience/health.py +300 -0
  184. empathy_os/resilience/retry.py +209 -0
  185. empathy_os/resilience/timeout.py +135 -0
  186. empathy_os/routing/__init__.py +43 -0
  187. empathy_os/routing/chain_executor.py +433 -0
  188. empathy_os/routing/classifier.py +217 -0
  189. empathy_os/routing/smart_router.py +234 -0
  190. empathy_os/routing/wizard_registry.py +307 -0
  191. empathy_os/templates.py +19 -14
  192. empathy_os/trust/__init__.py +28 -0
  193. empathy_os/trust/circuit_breaker.py +579 -0
  194. empathy_os/trust_building.py +67 -58
  195. empathy_os/validation/__init__.py +19 -0
  196. empathy_os/validation/xml_validator.py +281 -0
  197. empathy_os/wizard_factory_cli.py +170 -0
  198. empathy_os/{workflows.py → workflow_commands.py} +131 -37
  199. empathy_os/workflows/__init__.py +360 -0
  200. empathy_os/workflows/base.py +1660 -0
  201. empathy_os/workflows/bug_predict.py +962 -0
  202. empathy_os/workflows/code_review.py +960 -0
  203. empathy_os/workflows/code_review_adapters.py +310 -0
  204. empathy_os/workflows/code_review_pipeline.py +720 -0
  205. empathy_os/workflows/config.py +600 -0
  206. empathy_os/workflows/dependency_check.py +648 -0
  207. empathy_os/workflows/document_gen.py +1069 -0
  208. empathy_os/workflows/documentation_orchestrator.py +1205 -0
  209. empathy_os/workflows/health_check.py +679 -0
  210. empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
  211. empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
  212. empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
  213. empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
  214. empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
  215. empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
  216. empathy_os/workflows/manage_documentation.py +804 -0
  217. empathy_os/workflows/new_sample_workflow1.py +146 -0
  218. empathy_os/workflows/new_sample_workflow1_README.md +150 -0
  219. empathy_os/workflows/perf_audit.py +687 -0
  220. empathy_os/workflows/pr_review.py +748 -0
  221. empathy_os/workflows/progress.py +445 -0
  222. empathy_os/workflows/progress_server.py +322 -0
  223. empathy_os/workflows/refactor_plan.py +693 -0
  224. empathy_os/workflows/release_prep.py +808 -0
  225. empathy_os/workflows/research_synthesis.py +404 -0
  226. empathy_os/workflows/secure_release.py +585 -0
  227. empathy_os/workflows/security_adapters.py +297 -0
  228. empathy_os/workflows/security_audit.py +1046 -0
  229. empathy_os/workflows/step_config.py +234 -0
  230. empathy_os/workflows/test5.py +125 -0
  231. empathy_os/workflows/test5_README.md +158 -0
  232. empathy_os/workflows/test_gen.py +1855 -0
  233. empathy_os/workflows/test_lifecycle.py +526 -0
  234. empathy_os/workflows/test_maintenance.py +626 -0
  235. empathy_os/workflows/test_maintenance_cli.py +590 -0
  236. empathy_os/workflows/test_maintenance_crew.py +821 -0
  237. empathy_os/workflows/xml_enhanced_crew.py +285 -0
  238. empathy_software_plugin/__init__.py +1 -2
  239. empathy_software_plugin/cli/__init__.py +120 -0
  240. empathy_software_plugin/cli/inspect.py +362 -0
  241. empathy_software_plugin/cli.py +49 -27
  242. empathy_software_plugin/plugin.py +4 -8
  243. empathy_software_plugin/wizards/__init__.py +42 -0
  244. empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
  245. empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
  246. empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
  247. empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
  248. empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
  249. empathy_software_plugin/wizards/base_wizard.py +288 -0
  250. empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
  251. empathy_software_plugin/wizards/code_review_wizard.py +606 -0
  252. empathy_software_plugin/wizards/debugging/__init__.py +50 -0
  253. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
  254. empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
  255. empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
  256. empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
  257. empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
  258. empathy_software_plugin/wizards/debugging/verification.py +369 -0
  259. empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
  260. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
  261. empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
  262. empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
  263. empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
  264. empathy_software_plugin/wizards/performance/__init__.py +9 -0
  265. empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
  266. empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
  267. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
  268. empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
  269. empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
  270. empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
  271. empathy_software_plugin/wizards/security/__init__.py +32 -0
  272. empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
  273. empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
  274. empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
  275. empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
  276. empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
  277. empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
  278. empathy_software_plugin/wizards/testing/__init__.py +27 -0
  279. empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
  280. empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
  281. empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
  282. empathy_software_plugin/wizards/testing_wizard.py +274 -0
  283. hot_reload/README.md +473 -0
  284. hot_reload/__init__.py +62 -0
  285. hot_reload/config.py +84 -0
  286. hot_reload/integration.py +228 -0
  287. hot_reload/reloader.py +298 -0
  288. hot_reload/watcher.py +179 -0
  289. hot_reload/websocket.py +176 -0
  290. scaffolding/README.md +589 -0
  291. scaffolding/__init__.py +35 -0
  292. scaffolding/__main__.py +14 -0
  293. scaffolding/cli.py +240 -0
  294. test_generator/__init__.py +38 -0
  295. test_generator/__main__.py +14 -0
  296. test_generator/cli.py +226 -0
  297. test_generator/generator.py +325 -0
  298. test_generator/risk_analyzer.py +216 -0
  299. workflow_patterns/__init__.py +33 -0
  300. workflow_patterns/behavior.py +249 -0
  301. workflow_patterns/core.py +76 -0
  302. workflow_patterns/output.py +99 -0
  303. workflow_patterns/registry.py +255 -0
  304. workflow_patterns/structural.py +288 -0
  305. workflow_scaffolding/__init__.py +11 -0
  306. workflow_scaffolding/__main__.py +12 -0
  307. workflow_scaffolding/cli.py +206 -0
  308. workflow_scaffolding/generator.py +265 -0
  309. agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
  310. agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
  311. agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
  312. agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
  313. agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
  314. agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
  315. agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
  316. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
  317. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
  318. agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
  319. agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
  320. agents/compliance_anticipation_agent.py +0 -1427
  321. agents/epic_integration_wizard.py +0 -541
  322. agents/trust_building_behaviors.py +0 -891
  323. empathy_framework-2.4.0.dist-info/METADATA +0 -485
  324. empathy_framework-2.4.0.dist-info/RECORD +0 -102
  325. empathy_framework-2.4.0.dist-info/entry_points.txt +0 -6
  326. empathy_llm_toolkit/htmlcov/status.json +0 -1
  327. empathy_llm_toolkit/security/htmlcov/status.json +0 -1
  328. {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
  329. {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,234 @@
1
+ """Smart Router
2
+
3
+ Intelligent dispatcher that analyzes developer input and routes
4
+ to the appropriate wizard(s) using LLM classification.
5
+
6
+ Copyright 2025 Smart AI Memory, LLC
7
+ Licensed under Fair Source 0.9
8
+ """
9
+
10
+ from dataclasses import dataclass, field
11
+ from typing import Any
12
+
13
+ from .classifier import ClassificationResult, HaikuClassifier
14
+ from .wizard_registry import WizardInfo, WizardRegistry
15
+
16
+
17
+ @dataclass
18
+ class RoutingDecision:
19
+ """Decision from the smart router."""
20
+
21
+ primary_wizard: str
22
+ secondary_wizards: list[str] = field(default_factory=list)
23
+ confidence: float = 0.0
24
+ reasoning: str = ""
25
+ suggested_chain: list[str] = field(default_factory=list)
26
+ context: dict[str, Any] = field(default_factory=dict)
27
+
28
+ # Metadata
29
+ classification_method: str = "llm" # llm, keyword, manual
30
+ request_summary: str = ""
31
+
32
+
33
+ class SmartRouter:
34
+ """Routes developer requests to appropriate wizard(s).
35
+
36
+ Uses LLM classification (Haiku) to understand natural language
37
+ requests and route them to the best wizard(s).
38
+
39
+ Usage:
40
+ router = SmartRouter()
41
+
42
+ # Async routing (preferred - uses LLM)
43
+ decision = await router.route("Fix the security issue in auth.py")
44
+ print(f"Primary: {decision.primary_wizard}")
45
+ print(f"Confidence: {decision.confidence}")
46
+
47
+ # Sync routing (keyword fallback)
48
+ decision = router.route_sync("Optimize database queries")
49
+ """
50
+
51
+ def __init__(self, api_key: str | None = None):
52
+ """Initialize the smart router.
53
+
54
+ Args:
55
+ api_key: Optional Anthropic API key for LLM classification
56
+
57
+ """
58
+ self._registry = WizardRegistry()
59
+ self._classifier = HaikuClassifier(api_key=api_key)
60
+
61
+ async def route(
62
+ self,
63
+ request: str,
64
+ context: dict[str, Any] | None = None,
65
+ ) -> RoutingDecision:
66
+ """Route a request to the appropriate wizard(s).
67
+
68
+ Uses LLM classification for accurate natural language understanding.
69
+
70
+ Args:
71
+ request: Developer's natural language request
72
+ context: Optional context (current file, project info, etc.)
73
+
74
+ Returns:
75
+ RoutingDecision with wizard recommendations
76
+
77
+ """
78
+ # Classify the request
79
+ classification = await self._classifier.classify(
80
+ request=request,
81
+ context=context,
82
+ )
83
+
84
+ # Build suggested chain based on wizard triggers
85
+ suggested_chain = self._build_chain(classification)
86
+
87
+ # Merge extracted context
88
+ merged_context = {**(context or {}), **classification.extracted_context}
89
+
90
+ return RoutingDecision(
91
+ primary_wizard=classification.primary_wizard,
92
+ secondary_wizards=classification.secondary_wizards,
93
+ confidence=classification.confidence,
94
+ reasoning=classification.reasoning,
95
+ suggested_chain=suggested_chain,
96
+ context=merged_context,
97
+ classification_method="llm",
98
+ request_summary=request[:100],
99
+ )
100
+
101
+ def route_sync(
102
+ self,
103
+ request: str,
104
+ context: dict[str, Any] | None = None,
105
+ ) -> RoutingDecision:
106
+ """Synchronous routing using keyword matching.
107
+
108
+ Faster but less accurate than LLM classification.
109
+
110
+ Args:
111
+ request: Developer's request
112
+ context: Optional context
113
+
114
+ Returns:
115
+ RoutingDecision with wizard recommendations
116
+
117
+ """
118
+ classification = self._classifier.classify_sync(
119
+ request=request,
120
+ context=context,
121
+ )
122
+
123
+ suggested_chain = self._build_chain(classification)
124
+
125
+ return RoutingDecision(
126
+ primary_wizard=classification.primary_wizard,
127
+ secondary_wizards=classification.secondary_wizards,
128
+ confidence=classification.confidence,
129
+ reasoning=classification.reasoning,
130
+ suggested_chain=suggested_chain,
131
+ context=context or {},
132
+ classification_method="keyword",
133
+ request_summary=request[:100],
134
+ )
135
+
136
+ def _build_chain(self, classification: ClassificationResult) -> list[str]:
137
+ """Build suggested wizard chain based on triggers."""
138
+ chain = [classification.primary_wizard]
139
+
140
+ # Add secondary wizards to chain
141
+ for secondary in classification.secondary_wizards:
142
+ if secondary not in chain:
143
+ chain.append(secondary)
144
+
145
+ # Check for auto-chain triggers from primary wizard
146
+ triggers = self._registry.get_chain_triggers(classification.primary_wizard)
147
+ for trigger in triggers:
148
+ next_wizard = trigger.get("next")
149
+ if next_wizard and next_wizard not in chain:
150
+ chain.append(next_wizard)
151
+
152
+ return chain
153
+
154
+ def get_wizard_info(self, name: str) -> WizardInfo | None:
155
+ """Get information about a specific wizard."""
156
+ return self._registry.get(name)
157
+
158
+ def list_wizards(self) -> list[WizardInfo]:
159
+ """List all available wizards."""
160
+ return self._registry.list_all()
161
+
162
+ def suggest_for_file(self, file_path: str) -> list[str]:
163
+ """Suggest wizards based on file type.
164
+
165
+ Args:
166
+ file_path: Path to the file
167
+
168
+ Returns:
169
+ List of suggested wizard names
170
+
171
+ """
172
+ suggestions = []
173
+
174
+ # Get file extension
175
+ ext = "." + file_path.rsplit(".", 1)[-1] if "." in file_path else ""
176
+ filename = file_path.rsplit("/", 1)[-1]
177
+
178
+ for wizard in self._registry.list_all():
179
+ if ext in wizard.handles_file_types or filename in wizard.handles_file_types:
180
+ suggestions.append(wizard.name)
181
+
182
+ # Default suggestions if no matches
183
+ if not suggestions:
184
+ suggestions = ["code-review", "security-audit"]
185
+
186
+ return suggestions
187
+
188
+ def suggest_for_error(self, error_type: str) -> list[str]:
189
+ """Suggest wizards based on error type.
190
+
191
+ Args:
192
+ error_type: Type of error (e.g., "TypeError", "SecurityError")
193
+
194
+ Returns:
195
+ List of suggested wizard names
196
+
197
+ """
198
+ error_lower = error_type.lower()
199
+
200
+ # Map error types to wizards
201
+ error_wizard_map = {
202
+ "security": ["security-audit", "code-review"],
203
+ "type": ["code-review", "bug-predict"],
204
+ "null": ["bug-predict", "test-gen"],
205
+ "undefined": ["bug-predict", "test-gen"],
206
+ "timeout": ["perf-audit", "bug-predict"],
207
+ "memory": ["perf-audit", "code-review"],
208
+ "import": ["dependency-check", "code-review"],
209
+ "permission": ["security-audit", "code-review"],
210
+ "syntax": ["code-review"],
211
+ "test": ["test-gen", "bug-predict"],
212
+ }
213
+
214
+ for keyword, wizards in error_wizard_map.items():
215
+ if keyword in error_lower:
216
+ return wizards
217
+
218
+ return ["bug-predict", "code-review"]
219
+
220
+
221
+ # Convenience function for quick routing
222
+ async def quick_route(request: str, context: dict | None = None) -> RoutingDecision:
223
+ """Quick routing helper.
224
+
225
+ Args:
226
+ request: Developer request
227
+ context: Optional context
228
+
229
+ Returns:
230
+ RoutingDecision
231
+
232
+ """
233
+ router = SmartRouter()
234
+ return await router.route(request, context)
@@ -0,0 +1,307 @@
1
+ """Wizard Registry
2
+
3
+ Central registry of available wizards with their descriptions,
4
+ capabilities, and auto-chain rules.
5
+
6
+ Copyright 2025 Smart AI Memory, LLC
7
+ Licensed under Fair Source 0.9
8
+ """
9
+
10
+ from collections.abc import Callable
11
+ from dataclasses import dataclass, field
12
+ from typing import Any
13
+
14
+
15
+ @dataclass
16
+ class WizardInfo:
17
+ """Information about a registered wizard."""
18
+
19
+ name: str
20
+ description: str
21
+ keywords: list[str] # Keywords for classification
22
+
23
+ # Classification hints
24
+ primary_domain: str = "" # security, performance, testing, etc.
25
+ handles_file_types: list[str] = field(default_factory=list)
26
+ complexity: str = "medium" # low, medium, high
27
+
28
+ # Chaining configuration
29
+ auto_chain: bool = False
30
+ chain_triggers: list[dict[str, Any]] = field(default_factory=list)
31
+
32
+ # Optional wizard class or factory
33
+ wizard_class: type | None = None
34
+ factory: Callable[..., Any] | None = None
35
+
36
+
37
+ # Default wizard registry
38
+ WIZARD_REGISTRY: dict[str, WizardInfo] = {
39
+ # Workflows (cost-optimized pipelines)
40
+ "security-audit": WizardInfo(
41
+ name="security-audit",
42
+ description="Analyze code for security vulnerabilities, injection risks, compliance",
43
+ keywords=[
44
+ "security",
45
+ "vulnerability",
46
+ "injection",
47
+ "xss",
48
+ "sql",
49
+ "auth",
50
+ "authentication",
51
+ "authorization",
52
+ "sensitive",
53
+ "credential",
54
+ "password",
55
+ "secret",
56
+ "owasp",
57
+ "cve",
58
+ "exploit",
59
+ ],
60
+ primary_domain="security",
61
+ handles_file_types=[".py", ".js", ".ts", ".java", ".go", ".rb"],
62
+ auto_chain=True,
63
+ chain_triggers=[
64
+ {"condition": "high_severity_count > 0", "next": "dependency-check"},
65
+ {"condition": "vulnerability_type == 'injection'", "next": "code-review"},
66
+ ],
67
+ ),
68
+ "code-review": WizardInfo(
69
+ name="code-review",
70
+ description="Review code for quality, best practices, maintainability, and bugs",
71
+ keywords=[
72
+ "review",
73
+ "code",
74
+ "quality",
75
+ "lint",
76
+ "style",
77
+ "convention",
78
+ "best practice",
79
+ "maintainability",
80
+ "readable",
81
+ "clean",
82
+ "refactor",
83
+ "smell",
84
+ ],
85
+ primary_domain="quality",
86
+ handles_file_types=[".py", ".js", ".ts", ".java", ".go", ".rb", ".cpp", ".c"],
87
+ auto_chain=True,
88
+ chain_triggers=[
89
+ {"condition": "has_complexity_issues", "next": "refactor-plan"},
90
+ ],
91
+ ),
92
+ "bug-predict": WizardInfo(
93
+ name="bug-predict",
94
+ description="Predict potential bugs based on code patterns and historical data",
95
+ keywords=[
96
+ "bug",
97
+ "error",
98
+ "crash",
99
+ "exception",
100
+ "fail",
101
+ "broken",
102
+ "fix",
103
+ "issue",
104
+ "problem",
105
+ "defect",
106
+ "null",
107
+ "undefined",
108
+ ],
109
+ primary_domain="debugging",
110
+ auto_chain=True,
111
+ chain_triggers=[
112
+ {"condition": "risk_score > 0.7", "next": "test-gen"},
113
+ ],
114
+ ),
115
+ "perf-audit": WizardInfo(
116
+ name="perf-audit",
117
+ description="Analyze code for performance issues, bottlenecks, optimizations",
118
+ keywords=[
119
+ "performance",
120
+ "perf",
121
+ "slow",
122
+ "fast",
123
+ "speed",
124
+ "optimize",
125
+ "bottleneck",
126
+ "memory",
127
+ "cpu",
128
+ "latency",
129
+ "throughput",
130
+ "cache",
131
+ "profile",
132
+ ],
133
+ primary_domain="performance",
134
+ auto_chain=True,
135
+ chain_triggers=[
136
+ {"condition": "hotspot_count > 5", "next": "refactor-plan"},
137
+ ],
138
+ ),
139
+ "refactor-plan": WizardInfo(
140
+ name="refactor-plan",
141
+ description="Plan code refactoring to improve structure, reduce complexity",
142
+ keywords=[
143
+ "refactor",
144
+ "restructure",
145
+ "reorganize",
146
+ "simplify",
147
+ "complexity",
148
+ "architecture",
149
+ "design",
150
+ "pattern",
151
+ "clean",
152
+ ],
153
+ primary_domain="architecture",
154
+ auto_chain=False, # Require approval for refactoring
155
+ ),
156
+ "test-gen": WizardInfo(
157
+ name="test-gen",
158
+ description="Generate test cases and improve test coverage",
159
+ keywords=[
160
+ "test",
161
+ "testing",
162
+ "unit",
163
+ "integration",
164
+ "coverage",
165
+ "pytest",
166
+ "jest",
167
+ "mock",
168
+ "assert",
169
+ "spec",
170
+ ],
171
+ primary_domain="testing",
172
+ handles_file_types=[".py", ".js", ".ts", ".java"],
173
+ auto_chain=True,
174
+ chain_triggers=[
175
+ {"condition": "coverage_low", "next": "bug-predict"},
176
+ ],
177
+ ),
178
+ "doc-gen": WizardInfo(
179
+ name="doc-gen",
180
+ description="Generate documentation from code including API docs, READMEs, and guides",
181
+ keywords=[
182
+ "document",
183
+ "doc",
184
+ "readme",
185
+ "api",
186
+ "explain",
187
+ "describe",
188
+ "comment",
189
+ "docstring",
190
+ "jsdoc",
191
+ ],
192
+ primary_domain="documentation",
193
+ auto_chain=False,
194
+ ),
195
+ "dependency-check": WizardInfo(
196
+ name="dependency-check",
197
+ description="Audit dependencies for vulnerabilities, updates, and license issues",
198
+ keywords=[
199
+ "dependency",
200
+ "package",
201
+ "npm",
202
+ "pip",
203
+ "library",
204
+ "version",
205
+ "update",
206
+ "outdated",
207
+ "license",
208
+ "vulnerability",
209
+ ],
210
+ primary_domain="dependencies",
211
+ handles_file_types=["requirements.txt", "package.json", "pyproject.toml", "Cargo.toml"],
212
+ auto_chain=True,
213
+ chain_triggers=[
214
+ {"condition": "critical_vuln_count > 0", "next": "security-audit"},
215
+ ],
216
+ ),
217
+ "release-prep": WizardInfo(
218
+ name="release-prep",
219
+ description="Pre-release quality gate with health checks, security scan, and changelog",
220
+ keywords=[
221
+ "release",
222
+ "deploy",
223
+ "publish",
224
+ "ship",
225
+ "version",
226
+ "changelog",
227
+ "ready",
228
+ "production",
229
+ ],
230
+ primary_domain="release",
231
+ auto_chain=False, # Always require approval
232
+ ),
233
+ "research": WizardInfo(
234
+ name="research",
235
+ description="Research and synthesize information from multiple sources",
236
+ keywords=[
237
+ "research",
238
+ "investigate",
239
+ "explore",
240
+ "analyze",
241
+ "study",
242
+ "understand",
243
+ "learn",
244
+ "compare",
245
+ ],
246
+ primary_domain="research",
247
+ auto_chain=False,
248
+ ),
249
+ }
250
+
251
+
252
+ class WizardRegistry:
253
+ """Registry for managing available wizards.
254
+
255
+ Usage:
256
+ registry = WizardRegistry()
257
+ info = registry.get("security-audit")
258
+ all_wizards = registry.list_all()
259
+ """
260
+
261
+ def __init__(self):
262
+ """Initialize with default wizards."""
263
+ self._wizards: dict[str, WizardInfo] = dict(WIZARD_REGISTRY)
264
+
265
+ def register(self, info: WizardInfo) -> None:
266
+ """Register a new wizard."""
267
+ self._wizards[info.name] = info
268
+
269
+ def get(self, name: str) -> WizardInfo | None:
270
+ """Get wizard info by name."""
271
+ return self._wizards.get(name)
272
+
273
+ def list_all(self) -> list[WizardInfo]:
274
+ """List all registered wizards."""
275
+ return list(self._wizards.values())
276
+
277
+ def find_by_domain(self, domain: str) -> list[WizardInfo]:
278
+ """Find wizards by primary domain."""
279
+ return [w for w in self._wizards.values() if w.primary_domain == domain]
280
+
281
+ def find_by_keyword(self, keyword: str) -> list[WizardInfo]:
282
+ """Find wizards that handle a keyword."""
283
+ keyword = keyword.lower()
284
+ return [
285
+ w for w in self._wizards.values() if any(keyword in kw.lower() for kw in w.keywords)
286
+ ]
287
+
288
+ def get_descriptions_for_classification(self) -> dict[str, str]:
289
+ """Get wizard name to description mapping for LLM classification."""
290
+ return {
291
+ name: f"{info.description} (domain: {info.primary_domain})"
292
+ for name, info in self._wizards.items()
293
+ }
294
+
295
+ def get_chain_triggers(self, wizard_name: str) -> list[dict[str, Any]]:
296
+ """Get auto-chain triggers for a wizard."""
297
+ info = self._wizards.get(wizard_name)
298
+ if info and info.auto_chain:
299
+ return info.chain_triggers
300
+ return []
301
+
302
+ def unregister(self, name: str) -> bool:
303
+ """Remove a wizard from the registry."""
304
+ if name in self._wizards:
305
+ del self._wizards[name]
306
+ return True
307
+ return False
empathy_os/templates.py CHANGED
@@ -1,5 +1,4 @@
1
- """
2
- Template Starters for Empathy Framework
1
+ """Template Starters for Empathy Framework
3
2
 
4
3
  Scaffold new projects with Empathy pre-configured for different use cases.
5
4
 
@@ -14,9 +13,10 @@ Licensed under Fair Source License 0.9
14
13
  """
15
14
 
16
15
  from pathlib import Path
16
+ from typing import Any
17
17
 
18
18
  # Template definitions
19
- TEMPLATES = {
19
+ TEMPLATES: dict[str, dict[str, Any]] = {
20
20
  "minimal": {
21
21
  "name": "Minimal",
22
22
  "description": "Just the Empathy config files - add to existing project",
@@ -618,10 +618,12 @@ def list_templates() -> list:
618
618
 
619
619
 
620
620
  def scaffold_project(
621
- template_name: str, project_name: str, target_dir: str | None = None, force: bool = False
621
+ template_name: str,
622
+ project_name: str,
623
+ target_dir: str | None = None,
624
+ force: bool = False,
622
625
  ) -> dict:
623
- """
624
- Create a new project from a template.
626
+ """Create a new project from a template.
625
627
 
626
628
  Args:
627
629
  template_name: Template ID (minimal, python-cli, python-fastapi, python-agent)
@@ -631,6 +633,7 @@ def scaffold_project(
631
633
 
632
634
  Returns:
633
635
  Dict with created files and status
636
+
634
637
  """
635
638
  if template_name not in TEMPLATES:
636
639
  return {
@@ -647,7 +650,7 @@ def scaffold_project(
647
650
  if any(target.iterdir()):
648
651
  return {
649
652
  "success": False,
650
- "error": f"Directory '{target}' already exists and is not empty. Use --force to overwrite.",
653
+ "error": f"Directory '{target}' exists and is not empty. Use --force to overwrite.",
651
654
  }
652
655
 
653
656
  # Create directory
@@ -660,7 +663,10 @@ def scaffold_project(
660
663
 
661
664
  # Create files
662
665
  created_files = []
663
- for file_path, content in template["files"].items():
666
+ files = template["files"]
667
+ if not isinstance(files, dict):
668
+ return {"success": False, "error": "Invalid template structure"}
669
+ for file_path, content in files.items():
664
670
  # Replace placeholders in path
665
671
  actual_path = file_path.replace("{{project_name}}", project_name)
666
672
 
@@ -738,9 +744,8 @@ def cmd_new(args):
738
744
  print(f" $ {step}")
739
745
  print()
740
746
  return 0
741
- else:
742
- print(f"\n Error: {result['error']}")
743
- if "available" in result:
744
- print(f" Available templates: {', '.join(result['available'])}")
745
- print()
746
- return 1
747
+ print(f"\n Error: {result['error']}")
748
+ if "available" in result:
749
+ print(f" Available templates: {', '.join(result['available'])}")
750
+ print()
751
+ return 1
@@ -0,0 +1,28 @@
1
+ """Trust Management Module
2
+
3
+ Cross-domain transfer of reliability patterns to human-AI trust management.
4
+ Implements Level 5 (Systems Thinking) capability.
5
+
6
+ Pattern Source: Circuit Breaker (reliability/circuit_breaker.py)
7
+ Transfer: Protect user trust like protecting system stability
8
+ """
9
+
10
+ from .circuit_breaker import (
11
+ TrustCircuitBreaker,
12
+ TrustConfig,
13
+ TrustDamageEvent,
14
+ TrustDamageType,
15
+ TrustRecoveryEvent,
16
+ TrustState,
17
+ create_trust_breaker,
18
+ )
19
+
20
+ __all__ = [
21
+ "TrustCircuitBreaker",
22
+ "TrustConfig",
23
+ "TrustDamageEvent",
24
+ "TrustDamageType",
25
+ "TrustRecoveryEvent",
26
+ "TrustState",
27
+ "create_trust_breaker",
28
+ ]