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,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.keys():
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
- return json.load(f)
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
- elif recent < previous:
99
+ if recent < previous:
99
100
  return "decreasing"
100
- else:
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", project_root: str = ".", verbose: bool = False
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) - run '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,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 empathy_llm_toolkit.cli.sync_claude import sync_patterns_to_claude
442
+ from pathlib import Path
350
443
 
351
- result = sync_patterns_to_claude(
352
- patterns_dir=patterns_dir, output_dir=".claude/rules/empathy"
353
- )
354
- if result.get("success"):
355
- print(f" PASS - {result.get('patterns_synced', 0)} patterns synced")
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