empathy-framework 4.9.1__py3-none-any.whl → 5.0.1__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 (47) hide show
  1. {empathy_framework-4.9.1.dist-info → empathy_framework-5.0.1.dist-info}/METADATA +1 -1
  2. {empathy_framework-4.9.1.dist-info → empathy_framework-5.0.1.dist-info}/RECORD +47 -26
  3. empathy_os/__init__.py +1 -1
  4. empathy_os/cache/hash_only.py +6 -3
  5. empathy_os/cache/hybrid.py +6 -3
  6. empathy_os/cli_legacy.py +27 -1
  7. empathy_os/cli_minimal.py +512 -15
  8. empathy_os/cli_router.py +145 -113
  9. empathy_os/cli_unified.py +25 -0
  10. empathy_os/dashboard/__init__.py +42 -0
  11. empathy_os/dashboard/app.py +512 -0
  12. empathy_os/dashboard/simple_server.py +403 -0
  13. empathy_os/dashboard/standalone_server.py +536 -0
  14. empathy_os/memory/__init__.py +19 -5
  15. empathy_os/memory/short_term.py +4 -70
  16. empathy_os/memory/types.py +2 -2
  17. empathy_os/models/__init__.py +3 -0
  18. empathy_os/models/adaptive_routing.py +437 -0
  19. empathy_os/models/registry.py +4 -4
  20. empathy_os/socratic/ab_testing.py +1 -1
  21. empathy_os/telemetry/__init__.py +29 -1
  22. empathy_os/telemetry/agent_coordination.py +478 -0
  23. empathy_os/telemetry/agent_tracking.py +350 -0
  24. empathy_os/telemetry/approval_gates.py +563 -0
  25. empathy_os/telemetry/event_streaming.py +405 -0
  26. empathy_os/telemetry/feedback_loop.py +557 -0
  27. empathy_os/vscode_bridge 2.py +173 -0
  28. empathy_os/workflows/__init__.py +4 -4
  29. empathy_os/workflows/base.py +495 -43
  30. empathy_os/workflows/history.py +3 -5
  31. empathy_os/workflows/output.py +410 -0
  32. empathy_os/workflows/progress.py +324 -22
  33. empathy_os/workflows/progressive/README 2.md +454 -0
  34. empathy_os/workflows/progressive/__init__ 2.py +92 -0
  35. empathy_os/workflows/progressive/cli 2.py +242 -0
  36. empathy_os/workflows/progressive/core 2.py +488 -0
  37. empathy_os/workflows/progressive/orchestrator 2.py +701 -0
  38. empathy_os/workflows/progressive/reports 2.py +528 -0
  39. empathy_os/workflows/progressive/telemetry 2.py +280 -0
  40. empathy_os/workflows/progressive/test_gen 2.py +514 -0
  41. empathy_os/workflows/progressive/workflow 2.py +628 -0
  42. empathy_os/workflows/routing.py +5 -0
  43. empathy_os/workflows/security_audit.py +189 -0
  44. {empathy_framework-4.9.1.dist-info → empathy_framework-5.0.1.dist-info}/WHEEL +0 -0
  45. {empathy_framework-4.9.1.dist-info → empathy_framework-5.0.1.dist-info}/entry_points.txt +0 -0
  46. {empathy_framework-4.9.1.dist-info → empathy_framework-5.0.1.dist-info}/licenses/LICENSE +0 -0
  47. {empathy_framework-4.9.1.dist-info → empathy_framework-5.0.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,173 @@
1
+ """VS Code Extension Bridge
2
+
3
+ Provides functions to write data that the VS Code extension can pick up.
4
+ Enables Claude Code CLI output to appear in VS Code webview panels.
5
+
6
+ Copyright 2026 Smart-AI-Memory
7
+ Licensed under Fair Source License 0.9
8
+ """
9
+
10
+ import json
11
+ from dataclasses import asdict, dataclass
12
+ from datetime import datetime
13
+ from pathlib import Path
14
+ from typing import Any
15
+
16
+
17
+ @dataclass
18
+ class ReviewFinding:
19
+ """A code review finding."""
20
+
21
+ id: str
22
+ file: str
23
+ line: int
24
+ severity: str # 'critical' | 'high' | 'medium' | 'low' | 'info'
25
+ category: str # 'security' | 'performance' | 'maintainability' | 'style' | 'correctness'
26
+ message: str
27
+ column: int = 1
28
+ details: str | None = None
29
+ recommendation: str | None = None
30
+
31
+
32
+ @dataclass
33
+ class CodeReviewResult:
34
+ """Code review results for VS Code bridge."""
35
+
36
+ findings: list[dict[str, Any]]
37
+ summary: dict[str, Any]
38
+ verdict: str # 'approve' | 'approve_with_suggestions' | 'request_changes' | 'reject'
39
+ security_score: int
40
+ formatted_report: str
41
+ model_tier_used: str
42
+ timestamp: str
43
+
44
+
45
+ def get_empathy_dir() -> Path:
46
+ """Get the .empathy directory, creating if needed."""
47
+ empathy_dir = Path(".empathy")
48
+ empathy_dir.mkdir(exist_ok=True)
49
+ return empathy_dir
50
+
51
+
52
+ def write_code_review_results(
53
+ findings: list[dict[str, Any]] | None = None,
54
+ summary: dict[str, Any] | None = None,
55
+ verdict: str = "approve_with_suggestions",
56
+ security_score: int = 85,
57
+ formatted_report: str = "",
58
+ model_tier_used: str = "capable",
59
+ ) -> Path:
60
+ """Write code review results for VS Code extension to pick up.
61
+
62
+ Args:
63
+ findings: List of finding dicts with keys: id, file, line, severity, category, message
64
+ summary: Summary dict with keys: total_findings, by_severity, by_category, files_affected
65
+ verdict: One of 'approve', 'approve_with_suggestions', 'request_changes', 'reject'
66
+ security_score: 0-100 score
67
+ formatted_report: Markdown formatted report
68
+ model_tier_used: 'cheap', 'capable', or 'premium'
69
+
70
+ Returns:
71
+ Path to the written file
72
+ """
73
+ findings = findings or []
74
+
75
+ # Build summary if not provided
76
+ if summary is None:
77
+ by_severity: dict[str, int] = {}
78
+ by_category: dict[str, int] = {}
79
+ files_affected: set[str] = set()
80
+
81
+ for f in findings:
82
+ sev = f.get("severity", "info")
83
+ cat = f.get("category", "correctness")
84
+ by_severity[sev] = by_severity.get(sev, 0) + 1
85
+ by_category[cat] = by_category.get(cat, 0) + 1
86
+ if f.get("file"):
87
+ files_affected.add(f["file"])
88
+
89
+ summary = {
90
+ "total_findings": len(findings),
91
+ "by_severity": by_severity,
92
+ "by_category": by_category,
93
+ "files_affected": list(files_affected),
94
+ }
95
+
96
+ result = CodeReviewResult(
97
+ findings=findings,
98
+ summary=summary,
99
+ verdict=verdict,
100
+ security_score=security_score,
101
+ formatted_report=formatted_report,
102
+ model_tier_used=model_tier_used,
103
+ timestamp=datetime.now().isoformat(),
104
+ )
105
+
106
+ output_path = get_empathy_dir() / "code-review-results.json"
107
+
108
+ with open(output_path, "w") as f:
109
+ json.dump(asdict(result), f, indent=2)
110
+
111
+ return output_path
112
+
113
+
114
+ def write_pr_review_results(
115
+ pr_number: int | str,
116
+ title: str,
117
+ findings: list[dict[str, Any]],
118
+ verdict: str = "approve_with_suggestions",
119
+ summary_text: str = "",
120
+ ) -> Path:
121
+ """Write PR review results for VS Code extension.
122
+
123
+ Convenience wrapper for PR reviews from GitHub.
124
+
125
+ Args:
126
+ pr_number: The PR number
127
+ title: PR title
128
+ findings: List of review findings
129
+ verdict: Review verdict
130
+ summary_text: Summary of the review
131
+
132
+ Returns:
133
+ Path to the written file
134
+ """
135
+ formatted_report = f"""## PR #{pr_number}: {title}
136
+
137
+ {summary_text}
138
+
139
+ ### Findings ({len(findings)})
140
+
141
+ """
142
+ for f in findings:
143
+ formatted_report += f"- **{f.get('severity', 'info').upper()}** [{f.get('file', 'unknown')}:{f.get('line', 0)}]: {f.get('message', '')}\n"
144
+
145
+ return write_code_review_results(
146
+ findings=findings,
147
+ verdict=verdict,
148
+ formatted_report=formatted_report,
149
+ model_tier_used="capable",
150
+ )
151
+
152
+
153
+ # Quick helper for Claude Code to call
154
+ def send_to_vscode(
155
+ message: str,
156
+ findings: list[dict[str, Any]] | None = None,
157
+ verdict: str = "approve_with_suggestions",
158
+ ) -> str:
159
+ """Quick helper to send review results to VS Code.
160
+
161
+ Usage in Claude Code:
162
+ from empathy_os.vscode_bridge import send_to_vscode
163
+ send_to_vscode("Review complete", findings=[...])
164
+
165
+ Returns:
166
+ Confirmation message
167
+ """
168
+ path = write_code_review_results(
169
+ findings=findings or [],
170
+ formatted_report=message,
171
+ verdict=verdict,
172
+ )
173
+ return f"Results written to {path} - VS Code will update automatically"
@@ -80,9 +80,11 @@ from .base import (
80
80
  get_workflow_stats,
81
81
  )
82
82
 
83
+ # Builder pattern for workflow construction
84
+ from .builder import WorkflowBuilder, workflow_builder
85
+
83
86
  # Config is small and frequently needed
84
87
  from .config import DEFAULT_MODELS, ModelConfig, WorkflowConfig, create_example_config, get_model
85
- from .step_config import WorkflowStepConfig, steps_from_tier_map, validate_step_config
86
88
 
87
89
  # Routing strategies (small, frequently needed for builder pattern)
88
90
  from .routing import (
@@ -92,9 +94,7 @@ from .routing import (
92
94
  RoutingContext,
93
95
  TierRoutingStrategy,
94
96
  )
95
-
96
- # Builder pattern for workflow construction
97
- from .builder import WorkflowBuilder, workflow_builder
97
+ from .step_config import WorkflowStepConfig, steps_from_tier_map, validate_step_config
98
98
 
99
99
  # Lazy import mapping for workflow classes
100
100
  _LAZY_WORKFLOW_IMPORTS: dict[str, tuple[str, str]] = {