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,362 @@
1
+ """Code Inspection CLI
2
+
3
+ Command-line interface for the Code Inspection Agent Pipeline.
4
+
5
+ Usage:
6
+ empathy-inspect [path] [options]
7
+
8
+ Examples:
9
+ empathy-inspect . # Inspect current directory
10
+ empathy-inspect ./src --parallel # Parallel mode
11
+ empathy-inspect . --format json # JSON output
12
+ empathy-inspect . --staged # Only staged changes
13
+ empathy-inspect . --fix # Auto-fix safe issues
14
+
15
+ Copyright 2025 Smart AI Memory, LLC
16
+ Licensed under Fair Source 0.9
17
+
18
+ """
19
+
20
+ import argparse
21
+ import asyncio
22
+ import sys
23
+ from pathlib import Path
24
+
25
+
26
+ async def run_auto_fix(project_path: str, verbose: bool = False) -> int:
27
+ """Run auto-fix using ruff.
28
+
29
+ Args:
30
+ project_path: Path to project to fix
31
+ verbose: Whether to show verbose output
32
+
33
+ Returns:
34
+ Number of issues fixed
35
+
36
+ """
37
+ import subprocess
38
+
39
+ fixed_count = 0
40
+
41
+ # Run ruff check with --fix
42
+ try:
43
+ print("\nRunning ruff --fix...")
44
+ result = subprocess.run(
45
+ ["ruff", "check", project_path, "--fix", "--exit-zero"],
46
+ check=False,
47
+ capture_output=True,
48
+ text=True,
49
+ )
50
+
51
+ if verbose and result.stdout:
52
+ print(result.stdout)
53
+
54
+ # Count fixes from output
55
+ if "Fixed" in result.stdout:
56
+ # Parse "Fixed X errors" or similar
57
+ import re
58
+
59
+ match = re.search(r"Fixed (\d+)", result.stdout)
60
+ if match:
61
+ fixed_count += int(match.group(1))
62
+
63
+ except FileNotFoundError:
64
+ print("Warning: ruff not found. Install with: pip install ruff")
65
+ except Exception as e:
66
+ print(f"Warning: ruff fix failed: {e}")
67
+
68
+ # Run ruff format for formatting fixes
69
+ try:
70
+ print("Running ruff format...")
71
+ result = subprocess.run(
72
+ ["ruff", "format", project_path],
73
+ check=False,
74
+ capture_output=True,
75
+ text=True,
76
+ )
77
+
78
+ if verbose and result.stdout:
79
+ print(result.stdout)
80
+
81
+ # Count formatted files
82
+ if "file" in result.stderr.lower():
83
+ import re
84
+
85
+ match = re.search(r"(\d+) file", result.stderr)
86
+ if match:
87
+ fixed_count += int(match.group(1))
88
+
89
+ except FileNotFoundError:
90
+ pass # Already warned above
91
+ except Exception as e:
92
+ if verbose:
93
+ print(f"Warning: ruff format failed: {e}")
94
+
95
+ # Run isort for import sorting
96
+ try:
97
+ print("Running isort...")
98
+ result = subprocess.run(
99
+ ["isort", project_path, "--profile", "black"],
100
+ check=False,
101
+ capture_output=True,
102
+ text=True,
103
+ )
104
+
105
+ if verbose and result.stdout:
106
+ print(result.stdout)
107
+
108
+ # isort shows "Fixing" for each file
109
+ if "Fixing" in result.stdout:
110
+ fixed_count += result.stdout.count("Fixing")
111
+
112
+ except FileNotFoundError:
113
+ if verbose:
114
+ print("Note: isort not found. Install with: pip install isort")
115
+ except Exception as e:
116
+ if verbose:
117
+ print(f"Warning: isort failed: {e}")
118
+
119
+ return fixed_count
120
+
121
+
122
+ def parse_args() -> argparse.Namespace:
123
+ """Parse command-line arguments."""
124
+ parser = argparse.ArgumentParser(
125
+ prog="empathy-inspect",
126
+ description="Code Inspection Agent Pipeline",
127
+ formatter_class=argparse.RawDescriptionHelpFormatter,
128
+ epilog="""
129
+ Examples:
130
+ empathy-inspect . Inspect current directory
131
+ empathy-inspect ./src --parallel Run static checks in parallel
132
+ empathy-inspect . --format json Output as JSON
133
+ empathy-inspect . --staged Inspect staged git changes only
134
+ empathy-inspect . --quick Quick mode (skip slow checks)
135
+ """,
136
+ )
137
+
138
+ parser.add_argument(
139
+ "path",
140
+ nargs="?",
141
+ default=".",
142
+ help="Path to inspect (default: current directory)",
143
+ )
144
+
145
+ parser.add_argument(
146
+ "--parallel",
147
+ action="store_true",
148
+ default=True,
149
+ help="Run Phase 1 tools in parallel (default: True)",
150
+ )
151
+
152
+ parser.add_argument(
153
+ "--no-parallel",
154
+ action="store_true",
155
+ help="Disable parallel execution",
156
+ )
157
+
158
+ parser.add_argument(
159
+ "--learning",
160
+ action="store_true",
161
+ default=True,
162
+ help="Enable pattern learning (default: True)",
163
+ )
164
+
165
+ parser.add_argument(
166
+ "--no-learning",
167
+ action="store_true",
168
+ help="Disable pattern learning",
169
+ )
170
+
171
+ parser.add_argument(
172
+ "--format",
173
+ "-f",
174
+ choices=["terminal", "json", "markdown", "sarif", "html"],
175
+ default="terminal",
176
+ help="Output format (default: terminal). Use 'sarif' for GitHub Actions.",
177
+ )
178
+
179
+ parser.add_argument(
180
+ "--staged",
181
+ action="store_true",
182
+ help="Only inspect staged git changes",
183
+ )
184
+
185
+ parser.add_argument(
186
+ "--changed",
187
+ action="store_true",
188
+ help="Only inspect changed files (vs HEAD)",
189
+ )
190
+
191
+ parser.add_argument(
192
+ "--quick",
193
+ "-q",
194
+ action="store_true",
195
+ help="Quick mode (skip slow checks like deep debugging)",
196
+ )
197
+
198
+ parser.add_argument(
199
+ "--fix",
200
+ action="store_true",
201
+ help="Auto-fix safe issues (formatting, imports)",
202
+ )
203
+
204
+ parser.add_argument(
205
+ "--verbose",
206
+ "-v",
207
+ action="store_true",
208
+ help="Verbose output",
209
+ )
210
+
211
+ parser.add_argument(
212
+ "--output",
213
+ "-o",
214
+ type=str,
215
+ help="Write report to file",
216
+ )
217
+
218
+ parser.add_argument(
219
+ "--exclude",
220
+ "-e",
221
+ type=str,
222
+ action="append",
223
+ default=[],
224
+ help="Glob patterns to exclude (can be used multiple times)",
225
+ )
226
+
227
+ # Baseline/suppression options
228
+ parser.add_argument(
229
+ "--no-baseline",
230
+ action="store_true",
231
+ help="Disable baseline filtering (show all findings)",
232
+ )
233
+
234
+ parser.add_argument(
235
+ "--baseline-init",
236
+ action="store_true",
237
+ help="Create an empty .empathy-baseline.json file",
238
+ )
239
+
240
+ parser.add_argument(
241
+ "--baseline-cleanup",
242
+ action="store_true",
243
+ help="Remove expired suppressions from baseline",
244
+ )
245
+
246
+ return parser.parse_args()
247
+
248
+
249
+ async def run_inspection(args: argparse.Namespace) -> int:
250
+ """Run the inspection and return exit code."""
251
+ # Import here to avoid slow startup
252
+ from agents.code_inspection import CodeInspectionAgent
253
+
254
+ # Resolve path
255
+ project_path = str(Path(args.path).resolve())
256
+
257
+ # Determine target mode
258
+ if args.staged:
259
+ target_mode = "staged"
260
+ elif args.changed:
261
+ target_mode = "changed"
262
+ else:
263
+ target_mode = "all"
264
+
265
+ # Create agent
266
+ agent = CodeInspectionAgent(
267
+ parallel_mode=args.parallel and not args.no_parallel,
268
+ learning_enabled=args.learning and not args.no_learning,
269
+ baseline_enabled=not args.no_baseline,
270
+ )
271
+
272
+ # Configure verbose logging
273
+ if args.verbose:
274
+ import logging
275
+
276
+ logging.basicConfig(level=logging.DEBUG)
277
+
278
+ # Run inspection
279
+ state = await agent.inspect(
280
+ project_path=project_path,
281
+ target_mode=target_mode,
282
+ exclude_patterns=args.exclude if args.exclude else None,
283
+ )
284
+
285
+ # Format report
286
+ report = agent.format_report(state, args.format)
287
+
288
+ # Output
289
+ if args.output:
290
+ output_path = Path(args.output)
291
+ output_path.write_text(report)
292
+ print(f"Report written to {output_path}")
293
+ else:
294
+ print(report)
295
+
296
+ # Auto-fix if requested
297
+ if args.fix:
298
+ fixed_count = await run_auto_fix(project_path, args.verbose)
299
+ if fixed_count > 0:
300
+ print(f"\nAuto-fixed {fixed_count} issues. Run inspection again to verify.")
301
+
302
+ # Return exit code based on health status
303
+ if state["health_status"] == "fail":
304
+ return 1
305
+ if state["health_status"] == "warn":
306
+ return 0 # Warn but don't fail
307
+ return 0
308
+
309
+
310
+ def handle_baseline_commands(args: argparse.Namespace) -> bool:
311
+ """Handle baseline-specific commands.
312
+
313
+ Returns:
314
+ True if a baseline command was handled (and should exit)
315
+
316
+ """
317
+ from agents.code_inspection.baseline import BaselineManager, create_baseline_file
318
+
319
+ project_path = str(Path(args.path).resolve())
320
+
321
+ if args.baseline_init:
322
+ baseline_path = create_baseline_file(project_path)
323
+ print(f"Created baseline file: {baseline_path}")
324
+ return True
325
+
326
+ if args.baseline_cleanup:
327
+ manager = BaselineManager(project_path)
328
+ if manager.load():
329
+ removed = manager.cleanup_expired()
330
+ print(f"Removed {removed} expired suppressions")
331
+ else:
332
+ print("No baseline file found")
333
+ return True
334
+
335
+ return False
336
+
337
+
338
+ def main():
339
+ """Main entry point for CLI."""
340
+ args = parse_args()
341
+
342
+ try:
343
+ # Handle baseline commands first
344
+ if handle_baseline_commands(args):
345
+ sys.exit(0)
346
+
347
+ exit_code = asyncio.run(run_inspection(args))
348
+ sys.exit(exit_code)
349
+ except KeyboardInterrupt:
350
+ print("\nInspection cancelled.")
351
+ sys.exit(130)
352
+ except Exception as e:
353
+ print(f"Error: {e}", file=sys.stderr)
354
+ if args.verbose:
355
+ import traceback
356
+
357
+ traceback.print_exc()
358
+ sys.exit(1)
359
+
360
+
361
+ if __name__ == "__main__":
362
+ main()
@@ -1,5 +1,4 @@
1
- """
2
- Empathy Framework - Software Development CLI
1
+ """Empathy Framework - Software Development CLI
3
2
 
4
3
  Command-line interface for running AI development wizards on your codebase.
5
4
 
@@ -25,10 +24,23 @@ from typing import Any
25
24
  sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src"))
26
25
 
27
26
  from empathy_os.logging_config import get_logger
28
- from empathy_os.plugins import get_global_registry
29
27
 
30
28
  logger = get_logger(__name__)
31
29
 
30
+
31
+ def get_global_registry():
32
+ """Get the global plugin registry.
33
+
34
+ This wrapper exists so tests can patch this function at the module level
35
+ via `empathy_software_plugin.cli.get_global_registry`.
36
+
37
+ Uses late binding to enable patching in tests.
38
+ """
39
+ from empathy_os.plugins import get_global_registry as _get_global_registry
40
+
41
+ return _get_global_registry()
42
+
43
+
32
44
  # Initialize colorama for cross-platform ANSI color support (especially Windows)
33
45
  try:
34
46
  import colorama
@@ -85,14 +97,14 @@ async def analyze_project(
85
97
  output_format: str = "text",
86
98
  verbose: bool = False,
87
99
  ):
88
- """
89
- Analyze a project with AI development wizards.
100
+ """Analyze a project with AI development wizards.
90
101
 
91
102
  Args:
92
103
  project_path: Path to project root
93
104
  wizard_names: List of wizard names to run (or None for all)
94
105
  output_format: 'text' or 'json'
95
106
  verbose: Show detailed output
107
+
96
108
  """
97
109
  logger.info(f"Starting project analysis for: {project_path} (format: {output_format})")
98
110
  print_header("Empathy Framework - AI Development Analysis")
@@ -179,8 +191,7 @@ async def analyze_project(
179
191
 
180
192
 
181
193
  async def gather_project_context(project_path: str) -> dict[str, Any]:
182
- """
183
- Gather context about the project.
194
+ """Gather context about the project.
184
195
 
185
196
  Returns dictionary with all context needed by wizards.
186
197
  """
@@ -221,8 +232,10 @@ async def gather_project_context(project_path: str) -> dict[str, Any]:
221
232
 
222
233
  # Parse AI calls
223
234
  context["ai_calls"].extend(parse_ai_calls(str(file_path), content))
224
- except Exception:
225
- pass # Skip files that can't be parsed
235
+ except Exception as e:
236
+ # Best effort: Skip files that can't be parsed (corrupted, binary, etc.)
237
+ logger.debug(f"Could not parse {file_path}: {e}")
238
+ pass
226
239
 
227
240
  # All Python/JS/TS files are code files
228
241
  context["code_files"].append(str(file_path))
@@ -251,6 +264,7 @@ async def gather_project_context(project_path: str) -> dict[str, Any]:
251
264
 
252
265
  result = subprocess.run(
253
266
  ["git", "log", "--oneline", "--name-only", "-50"],
267
+ check=False,
254
268
  cwd=project_path,
255
269
  capture_output=True,
256
270
  text=True,
@@ -258,8 +272,10 @@ async def gather_project_context(project_path: str) -> dict[str, Any]:
258
272
  )
259
273
  if result.returncode == 0:
260
274
  context["version_history"] = parse_git_history(result.stdout)
261
- except Exception:
262
- pass # Skip if git not available or fails
275
+ except Exception as e:
276
+ # Optional: Git history unavailable (not a git repo or git not installed)
277
+ logger.debug(f"Could not fetch git history: {e}")
278
+ pass
263
279
 
264
280
  return context
265
281
 
@@ -278,7 +294,7 @@ def parse_ai_calls(file_path: str, content: str) -> list[dict[str, Any]]:
278
294
  "code_snippet": content[:500], # First 500 chars as sample
279
295
  "prompt_size": len(content),
280
296
  "conversation_id": None, # Could detect from context
281
- }
297
+ },
282
298
  )
283
299
 
284
300
  return calls
@@ -307,7 +323,6 @@ def parse_git_history(git_output: str) -> list[dict[str, Any]]:
307
323
 
308
324
  def prepare_wizard_context(wizard_name: str, full_context: dict[str, Any]) -> dict[str, Any]:
309
325
  """Prepare context specific to a wizard's requirements"""
310
-
311
326
  base_context = {
312
327
  "project_path": full_context["project_path"],
313
328
  "version_history": full_context.get("version_history", []),
@@ -319,7 +334,7 @@ def prepare_wizard_context(wizard_name: str, full_context: dict[str, Any]) -> di
319
334
  "prompt_files": full_context.get("prompt_files", []),
320
335
  }
321
336
 
322
- elif wizard_name == "context_window":
337
+ if wizard_name == "context_window":
323
338
  return {
324
339
  **base_context,
325
340
  "ai_calls": full_context.get("ai_calls", []),
@@ -328,14 +343,14 @@ def prepare_wizard_context(wizard_name: str, full_context: dict[str, Any]) -> di
328
343
  "model_name": "claude-3-sonnet",
329
344
  }
330
345
 
331
- elif wizard_name == "collaboration_pattern":
346
+ if wizard_name == "collaboration_pattern":
332
347
  return {
333
348
  **base_context,
334
349
  "ai_integration_files": full_context.get("ai_integration_files", []),
335
350
  "ai_usage_patterns": full_context.get("ai_usage_patterns", []),
336
351
  }
337
352
 
338
- elif wizard_name == "ai_documentation":
353
+ if wizard_name == "ai_documentation":
339
354
  return {
340
355
  **base_context,
341
356
  "documentation_files": full_context.get("documentation_files", []),
@@ -347,7 +362,6 @@ def prepare_wizard_context(wizard_name: str, full_context: dict[str, Any]) -> di
347
362
 
348
363
  def display_wizard_results(wizard, result: dict[str, Any], verbose: bool):
349
364
  """Display wizard results in human-readable format"""
350
-
351
365
  # Issues
352
366
  issues = result.get("issues", [])
353
367
  if issues:
@@ -448,7 +462,7 @@ def list_wizards():
448
462
  print(f"\n{Colors.BOLD}{wizard_id}{Colors.END}")
449
463
  print(f" Name: {info['name']}")
450
464
  print(
451
- f" Level: {info['empathy_level']} ({'Anticipatory' if info['empathy_level'] == 4 else 'Other'})"
465
+ f" Level: {info['empathy_level']} ({'Anticipatory' if info['empathy_level'] == 4 else 'Other'})",
452
466
  )
453
467
  print(f" Category: {info.get('category', 'N/A')}")
454
468
 
@@ -507,10 +521,15 @@ Examples:
507
521
  analyze_parser = subparsers.add_parser("analyze", help="Analyze a project")
508
522
  analyze_parser.add_argument("path", help="Path to project")
509
523
  analyze_parser.add_argument(
510
- "--wizards", help="Comma-separated list of wizards to run", default=None
524
+ "--wizards",
525
+ help="Comma-separated list of wizards to run",
526
+ default=None,
511
527
  )
512
528
  analyze_parser.add_argument(
513
- "--output", choices=["text", "json"], default="text", help="Output format"
529
+ "--output",
530
+ choices=["text", "json"],
531
+ default="text",
532
+ help="Output format",
514
533
  )
515
534
  analyze_parser.add_argument("--verbose", action="store_true", help="Show detailed output")
516
535
 
@@ -539,21 +558,20 @@ Examples:
539
558
  wizard_names=wizard_names,
540
559
  output_format=args.output,
541
560
  verbose=args.verbose,
542
- )
561
+ ),
543
562
  )
544
563
 
545
- elif args.command == "list-wizards":
564
+ if args.command == "list-wizards":
546
565
  return list_wizards()
547
566
 
548
- elif args.command == "wizard-info":
567
+ if args.command == "wizard-info":
549
568
  return wizard_info(args.wizard_id)
550
569
 
551
570
  return 0
552
571
 
553
572
 
554
573
  def scan_command():
555
- """
556
- Entry point for empathy-scan command (converted from bin/empathy-scan).
574
+ """Entry point for empathy-scan command (converted from bin/empathy-scan).
557
575
  One-click security & performance scanner.
558
576
  """
559
577
  logger.info("Empathy Framework security and performance scanner started")
@@ -633,7 +651,9 @@ def scan_command():
633
651
 
634
652
  for wizard_name, wizard in wizards:
635
653
  result = wizard.run_full_analysis(
636
- code=code, file_path=str(file_path), language="python"
654
+ code=code,
655
+ file_path=str(file_path),
656
+ language="python",
637
657
  )
638
658
 
639
659
  if result.issues:
@@ -642,7 +662,9 @@ def scan_command():
642
662
  severity_icon = (
643
663
  "🔴"
644
664
  if issue.severity == "high"
645
- else "🟡" if issue.severity == "medium" else "🔵"
665
+ else "🟡"
666
+ if issue.severity == "medium"
667
+ else "🔵"
646
668
  )
647
669
  print(f" {severity_icon} Line {issue.line_number}: {issue.message}")
648
670
  if len(result.issues) > 3:
@@ -1,5 +1,4 @@
1
- """
2
- Software Development Plugin for Empathy Framework
1
+ """Software Development Plugin for Empathy Framework
3
2
 
4
3
  This plugin provides 16+ Coach wizards for code analysis,
5
4
  demonstrating Level 4 Anticipatory Empathy in software development.
@@ -25,8 +24,7 @@ logger = logging.getLogger(__name__)
25
24
 
26
25
 
27
26
  class SoftwarePlugin(BasePlugin):
28
- """
29
- Software Development Domain Plugin
27
+ """Software Development Domain Plugin
30
28
 
31
29
  Provides wizards for:
32
30
  - Security analysis
@@ -59,8 +57,7 @@ class SoftwarePlugin(BasePlugin):
59
57
  )
60
58
 
61
59
  def register_wizards(self) -> dict[str, type[BaseWizard]]:
62
- """
63
- Register all software development wizards.
60
+ """Register all software development wizards.
64
61
 
65
62
  In our experience building these wizards, we found that the framework
66
63
  enables a fundamental shift: instead of reactive debugging, the system
@@ -157,8 +154,7 @@ class SoftwarePlugin(BasePlugin):
157
154
  return wizards
158
155
 
159
156
  def register_patterns(self) -> dict:
160
- """
161
- Register software development patterns.
157
+ """Register software development patterns.
162
158
 
163
159
  These patterns were learned from real-world usage and enable
164
160
  cross-domain learning (Level 5 Systems Empathy).
@@ -0,0 +1,42 @@
1
+ """Software Development Wizards
2
+
3
+ Production-ready wizards for software development with memory enhancement.
4
+
5
+ Memory-Enhanced Wizards (Level 4+):
6
+ - MemoryEnhancedDebuggingWizard: Bug correlation with historical patterns
7
+ - TechDebtWizard: Tech debt trajectory tracking and prediction
8
+ - SecurityLearningWizard: Security scanning with false positive learning
9
+
10
+ Utility Wizards:
11
+ - PatternRetrieverWizard: Pattern search and retrieval (Level 3)
12
+ - PatternExtractionWizard: Auto-detect fixes and suggest patterns (Level 3)
13
+ - CodeReviewWizard: Pattern-based code review (Level 4)
14
+
15
+ Core Wizards:
16
+ - SecurityAnalysisWizard: OWASP vulnerability detection
17
+ - AdvancedDebuggingWizard: Protocol-based debugging
18
+ - PerformanceProfilingWizard: Performance analysis
19
+ - TestingWizard: Test coverage and quality
20
+ - AIDocumentationWizard: Documentation generation
21
+
22
+ Copyright 2025 Smart AI Memory, LLC
23
+ Licensed under Fair Source 0.9
24
+ """
25
+
26
+ from .base_wizard import BaseWizard
27
+ from .code_review_wizard import CodeReviewWizard
28
+ from .memory_enhanced_debugging_wizard import MemoryEnhancedDebuggingWizard
29
+ from .pattern_extraction_wizard import PatternExtractionWizard
30
+ from .pattern_retriever_wizard import PatternRetrieverWizard
31
+ from .security_learning_wizard import SecurityLearningWizard
32
+ from .tech_debt_wizard import TechDebtWizard
33
+
34
+ __all__ = [
35
+ "BaseWizard",
36
+ "CodeReviewWizard",
37
+ "MemoryEnhancedDebuggingWizard",
38
+ "PatternExtractionWizard",
39
+ "PatternRetrieverWizard",
40
+ "SecurityLearningWizard",
41
+ "TechDebtWizard",
42
+ ]