empathy-framework 4.6.6__py3-none-any.whl → 4.7.0__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 (247) hide show
  1. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/METADATA +7 -6
  2. empathy_framework-4.7.0.dist-info/RECORD +354 -0
  3. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/top_level.txt +0 -2
  4. empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
  5. empathy_llm_toolkit/agent_factory/__init__.py +6 -6
  6. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
  7. empathy_llm_toolkit/agents_md/__init__.py +22 -0
  8. empathy_llm_toolkit/agents_md/loader.py +218 -0
  9. empathy_llm_toolkit/agents_md/parser.py +271 -0
  10. empathy_llm_toolkit/agents_md/registry.py +307 -0
  11. empathy_llm_toolkit/commands/__init__.py +51 -0
  12. empathy_llm_toolkit/commands/context.py +375 -0
  13. empathy_llm_toolkit/commands/loader.py +301 -0
  14. empathy_llm_toolkit/commands/models.py +231 -0
  15. empathy_llm_toolkit/commands/parser.py +371 -0
  16. empathy_llm_toolkit/commands/registry.py +429 -0
  17. empathy_llm_toolkit/config/__init__.py +8 -8
  18. empathy_llm_toolkit/config/unified.py +3 -7
  19. empathy_llm_toolkit/context/__init__.py +22 -0
  20. empathy_llm_toolkit/context/compaction.py +455 -0
  21. empathy_llm_toolkit/context/manager.py +434 -0
  22. empathy_llm_toolkit/hooks/__init__.py +24 -0
  23. empathy_llm_toolkit/hooks/config.py +306 -0
  24. empathy_llm_toolkit/hooks/executor.py +289 -0
  25. empathy_llm_toolkit/hooks/registry.py +302 -0
  26. empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
  27. empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
  28. empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
  29. empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
  30. empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
  31. empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
  32. empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
  33. empathy_llm_toolkit/learning/__init__.py +30 -0
  34. empathy_llm_toolkit/learning/evaluator.py +438 -0
  35. empathy_llm_toolkit/learning/extractor.py +514 -0
  36. empathy_llm_toolkit/learning/storage.py +560 -0
  37. empathy_llm_toolkit/providers.py +4 -11
  38. empathy_llm_toolkit/security/__init__.py +17 -17
  39. empathy_llm_toolkit/utils/tokens.py +2 -5
  40. empathy_os/__init__.py +202 -70
  41. empathy_os/cache_monitor.py +5 -3
  42. empathy_os/cli/__init__.py +11 -55
  43. empathy_os/cli/__main__.py +29 -15
  44. empathy_os/cli/commands/inspection.py +21 -12
  45. empathy_os/cli/commands/memory.py +4 -12
  46. empathy_os/cli/commands/profiling.py +198 -0
  47. empathy_os/cli/commands/utilities.py +27 -7
  48. empathy_os/cli.py +28 -57
  49. empathy_os/cli_unified.py +525 -1164
  50. empathy_os/cost_tracker.py +9 -3
  51. empathy_os/dashboard/server.py +200 -2
  52. empathy_os/hot_reload/__init__.py +7 -7
  53. empathy_os/hot_reload/config.py +6 -7
  54. empathy_os/hot_reload/integration.py +35 -35
  55. empathy_os/hot_reload/reloader.py +57 -57
  56. empathy_os/hot_reload/watcher.py +28 -28
  57. empathy_os/hot_reload/websocket.py +2 -2
  58. empathy_os/memory/__init__.py +11 -4
  59. empathy_os/memory/claude_memory.py +1 -1
  60. empathy_os/memory/cross_session.py +8 -12
  61. empathy_os/memory/edges.py +6 -6
  62. empathy_os/memory/file_session.py +770 -0
  63. empathy_os/memory/graph.py +30 -30
  64. empathy_os/memory/nodes.py +6 -6
  65. empathy_os/memory/short_term.py +15 -9
  66. empathy_os/memory/unified.py +606 -140
  67. empathy_os/meta_workflows/agent_creator.py +3 -9
  68. empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
  69. empathy_os/meta_workflows/form_engine.py +6 -18
  70. empathy_os/meta_workflows/intent_detector.py +64 -24
  71. empathy_os/meta_workflows/models.py +3 -1
  72. empathy_os/meta_workflows/pattern_learner.py +13 -31
  73. empathy_os/meta_workflows/plan_generator.py +55 -47
  74. empathy_os/meta_workflows/session_context.py +2 -3
  75. empathy_os/meta_workflows/workflow.py +20 -51
  76. empathy_os/models/cli.py +2 -2
  77. empathy_os/models/tasks.py +1 -2
  78. empathy_os/models/telemetry.py +4 -1
  79. empathy_os/models/token_estimator.py +3 -1
  80. empathy_os/monitoring/alerts.py +938 -9
  81. empathy_os/monitoring/alerts_cli.py +346 -183
  82. empathy_os/orchestration/execution_strategies.py +12 -29
  83. empathy_os/orchestration/pattern_learner.py +20 -26
  84. empathy_os/orchestration/real_tools.py +6 -15
  85. empathy_os/platform_utils.py +2 -1
  86. empathy_os/plugins/__init__.py +2 -2
  87. empathy_os/plugins/base.py +64 -64
  88. empathy_os/plugins/registry.py +32 -32
  89. empathy_os/project_index/index.py +49 -15
  90. empathy_os/project_index/models.py +1 -2
  91. empathy_os/project_index/reports.py +1 -1
  92. empathy_os/project_index/scanner.py +1 -0
  93. empathy_os/redis_memory.py +10 -7
  94. empathy_os/resilience/__init__.py +1 -1
  95. empathy_os/resilience/health.py +10 -10
  96. empathy_os/routing/__init__.py +7 -7
  97. empathy_os/routing/chain_executor.py +37 -37
  98. empathy_os/routing/classifier.py +36 -36
  99. empathy_os/routing/smart_router.py +40 -40
  100. empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
  101. empathy_os/scaffolding/__init__.py +8 -8
  102. empathy_os/scaffolding/__main__.py +1 -1
  103. empathy_os/scaffolding/cli.py +28 -28
  104. empathy_os/socratic/__init__.py +3 -19
  105. empathy_os/socratic/ab_testing.py +25 -36
  106. empathy_os/socratic/blueprint.py +38 -38
  107. empathy_os/socratic/cli.py +34 -20
  108. empathy_os/socratic/collaboration.py +30 -28
  109. empathy_os/socratic/domain_templates.py +9 -1
  110. empathy_os/socratic/embeddings.py +17 -13
  111. empathy_os/socratic/engine.py +135 -70
  112. empathy_os/socratic/explainer.py +70 -60
  113. empathy_os/socratic/feedback.py +24 -19
  114. empathy_os/socratic/forms.py +15 -10
  115. empathy_os/socratic/generator.py +51 -35
  116. empathy_os/socratic/llm_analyzer.py +25 -23
  117. empathy_os/socratic/mcp_server.py +99 -159
  118. empathy_os/socratic/session.py +19 -13
  119. empathy_os/socratic/storage.py +98 -67
  120. empathy_os/socratic/success.py +38 -27
  121. empathy_os/socratic/visual_editor.py +51 -39
  122. empathy_os/socratic/web_ui.py +99 -66
  123. empathy_os/telemetry/cli.py +3 -1
  124. empathy_os/telemetry/usage_tracker.py +1 -3
  125. empathy_os/test_generator/__init__.py +3 -3
  126. empathy_os/test_generator/cli.py +28 -28
  127. empathy_os/test_generator/generator.py +64 -66
  128. empathy_os/test_generator/risk_analyzer.py +11 -11
  129. empathy_os/vscode_bridge.py +173 -0
  130. empathy_os/workflows/__init__.py +212 -120
  131. empathy_os/workflows/batch_processing.py +8 -24
  132. empathy_os/workflows/bug_predict.py +1 -1
  133. empathy_os/workflows/code_review.py +20 -5
  134. empathy_os/workflows/code_review_pipeline.py +13 -8
  135. empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
  136. empathy_os/workflows/manage_documentation.py +1 -0
  137. empathy_os/workflows/orchestrated_health_check.py +6 -11
  138. empathy_os/workflows/orchestrated_release_prep.py +3 -3
  139. empathy_os/workflows/pr_review.py +18 -10
  140. empathy_os/workflows/progressive/__init__.py +2 -12
  141. empathy_os/workflows/progressive/cli.py +14 -37
  142. empathy_os/workflows/progressive/core.py +12 -12
  143. empathy_os/workflows/progressive/orchestrator.py +166 -144
  144. empathy_os/workflows/progressive/reports.py +22 -31
  145. empathy_os/workflows/progressive/telemetry.py +8 -14
  146. empathy_os/workflows/progressive/test_gen.py +29 -48
  147. empathy_os/workflows/progressive/workflow.py +31 -70
  148. empathy_os/workflows/release_prep.py +21 -6
  149. empathy_os/workflows/release_prep_crew.py +1 -0
  150. empathy_os/workflows/secure_release.py +13 -6
  151. empathy_os/workflows/security_audit.py +8 -3
  152. empathy_os/workflows/test_coverage_boost_crew.py +3 -2
  153. empathy_os/workflows/test_maintenance_crew.py +1 -0
  154. empathy_os/workflows/test_runner.py +16 -12
  155. empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
  156. empathy_software_plugin/cli.py +0 -122
  157. coach_wizards/__init__.py +0 -45
  158. coach_wizards/accessibility_wizard.py +0 -91
  159. coach_wizards/api_wizard.py +0 -91
  160. coach_wizards/base_wizard.py +0 -209
  161. coach_wizards/cicd_wizard.py +0 -91
  162. coach_wizards/code_reviewer_README.md +0 -60
  163. coach_wizards/code_reviewer_wizard.py +0 -180
  164. coach_wizards/compliance_wizard.py +0 -91
  165. coach_wizards/database_wizard.py +0 -91
  166. coach_wizards/debugging_wizard.py +0 -91
  167. coach_wizards/documentation_wizard.py +0 -91
  168. coach_wizards/generate_wizards.py +0 -347
  169. coach_wizards/localization_wizard.py +0 -173
  170. coach_wizards/migration_wizard.py +0 -91
  171. coach_wizards/monitoring_wizard.py +0 -91
  172. coach_wizards/observability_wizard.py +0 -91
  173. coach_wizards/performance_wizard.py +0 -91
  174. coach_wizards/prompt_engineering_wizard.py +0 -661
  175. coach_wizards/refactoring_wizard.py +0 -91
  176. coach_wizards/scaling_wizard.py +0 -90
  177. coach_wizards/security_wizard.py +0 -92
  178. coach_wizards/testing_wizard.py +0 -91
  179. empathy_framework-4.6.6.dist-info/RECORD +0 -410
  180. empathy_llm_toolkit/wizards/__init__.py +0 -43
  181. empathy_llm_toolkit/wizards/base_wizard.py +0 -364
  182. empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
  183. empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
  184. empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
  185. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
  186. empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
  187. empathy_os/wizard_factory_cli.py +0 -170
  188. empathy_software_plugin/wizards/__init__.py +0 -42
  189. empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
  190. empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
  191. empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
  192. empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
  193. empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
  194. empathy_software_plugin/wizards/base_wizard.py +0 -288
  195. empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
  196. empathy_software_plugin/wizards/code_review_wizard.py +0 -604
  197. empathy_software_plugin/wizards/debugging/__init__.py +0 -50
  198. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
  199. empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
  200. empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
  201. empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
  202. empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
  203. empathy_software_plugin/wizards/debugging/verification.py +0 -369
  204. empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
  205. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
  206. empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
  207. empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
  208. empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
  209. empathy_software_plugin/wizards/performance/__init__.py +0 -9
  210. empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
  211. empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
  212. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
  213. empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
  214. empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
  215. empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
  216. empathy_software_plugin/wizards/security/__init__.py +0 -32
  217. empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
  218. empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
  219. empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
  220. empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
  221. empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
  222. empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
  223. empathy_software_plugin/wizards/testing/__init__.py +0 -27
  224. empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
  225. empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
  226. empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
  227. empathy_software_plugin/wizards/testing_wizard.py +0 -274
  228. wizards/__init__.py +0 -82
  229. wizards/admission_assessment_wizard.py +0 -644
  230. wizards/care_plan.py +0 -321
  231. wizards/clinical_assessment.py +0 -769
  232. wizards/discharge_planning.py +0 -77
  233. wizards/discharge_summary_wizard.py +0 -468
  234. wizards/dosage_calculation.py +0 -497
  235. wizards/incident_report_wizard.py +0 -454
  236. wizards/medication_reconciliation.py +0 -85
  237. wizards/nursing_assessment.py +0 -171
  238. wizards/patient_education.py +0 -654
  239. wizards/quality_improvement.py +0 -705
  240. wizards/sbar_report.py +0 -324
  241. wizards/sbar_wizard.py +0 -608
  242. wizards/shift_handoff_wizard.py +0 -535
  243. wizards/soap_note_wizard.py +0 -679
  244. wizards/treatment_plan.py +0 -15
  245. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/WHEEL +0 -0
  246. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/entry_points.txt +0 -0
  247. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,414 +0,0 @@
1
- """Bug Risk Analyzer (Level 4)
2
-
3
- Predicts which linting violations are likely to cause production bugs.
4
-
5
- This is Level 4 Anticipatory Empathy - analyzing trajectory and alerting
6
- to future problems before they happen.
7
-
8
- Copyright 2025 Smart AI Memory, LLC
9
- Licensed under Fair Source 0.9
10
- """
11
-
12
- from dataclasses import dataclass
13
- from enum import Enum
14
- from typing import Any
15
-
16
- from .linter_parsers import LintIssue
17
-
18
-
19
- class BugRisk(Enum):
20
- """Bug risk levels"""
21
-
22
- CRITICAL = "critical" # Will definitely cause runtime errors
23
- HIGH = "high" # Very likely to cause bugs
24
- MEDIUM = "medium" # May cause subtle bugs
25
- LOW = "low" # Unlikely to cause bugs
26
- STYLE = "style" # Style only, no bug risk
27
-
28
-
29
- @dataclass
30
- class RiskAssessment:
31
- """Risk assessment for a linting issue"""
32
-
33
- issue: LintIssue
34
- risk_level: BugRisk
35
- reasoning: str
36
- impact: str
37
- likelihood: float # 0.0 to 1.0
38
- prevention_steps: list[str]
39
-
40
- def to_dict(self) -> dict[str, Any]:
41
- """Convert to dictionary"""
42
- return {
43
- "issue": self.issue.to_dict(),
44
- "risk_level": self.risk_level.value,
45
- "reasoning": self.reasoning,
46
- "impact": self.impact,
47
- "likelihood": self.likelihood,
48
- "prevention_steps": self.prevention_steps,
49
- }
50
-
51
-
52
- class BugRiskAnalyzer:
53
- """Analyzes linting violations to predict bug risk.
54
-
55
- This implements Level 4 Anticipatory Empathy by:
56
- 1. Mapping violations to known bug patterns
57
- 2. Predicting which issues will cause production failures
58
- 3. Alerting developers BEFORE deployment
59
- 4. Recommending prevention steps
60
- """
61
-
62
- def __init__(self):
63
- # Rule -> Risk mappings based on experience
64
- self.eslint_risk_patterns = self._get_eslint_patterns()
65
- self.pylint_risk_patterns = self._get_pylint_patterns()
66
- self.typescript_risk_patterns = self._get_typescript_patterns()
67
-
68
- def analyze(self, issues: list[LintIssue]) -> list[RiskAssessment]:
69
- """Analyze issues and return risk assessments.
70
-
71
- Args:
72
- issues: List of linting issues
73
-
74
- Returns:
75
- List of RiskAssessment objects, sorted by risk level
76
-
77
- """
78
- assessments = []
79
-
80
- for issue in issues:
81
- assessment = self._assess_issue(issue)
82
- assessments.append(assessment)
83
-
84
- # Sort by risk (critical first)
85
- risk_order = {
86
- BugRisk.CRITICAL: 0,
87
- BugRisk.HIGH: 1,
88
- BugRisk.MEDIUM: 2,
89
- BugRisk.LOW: 3,
90
- BugRisk.STYLE: 4,
91
- }
92
-
93
- assessments.sort(key=lambda a: risk_order[a.risk_level])
94
-
95
- return assessments
96
-
97
- def _assess_issue(self, issue: LintIssue) -> RiskAssessment:
98
- """Assess single issue"""
99
- # Route to appropriate pattern library
100
- if issue.linter == "eslint":
101
- patterns = self.eslint_risk_patterns
102
- elif issue.linter == "pylint":
103
- patterns = self.pylint_risk_patterns
104
- elif issue.linter in ["typescript", "tsc"]:
105
- patterns = self.typescript_risk_patterns
106
- elif issue.linter == "mypy":
107
- patterns = self.pylint_risk_patterns # Similar
108
- else:
109
- patterns = {}
110
-
111
- # Get pattern for this rule
112
- pattern = patterns.get(
113
- issue.rule,
114
- {
115
- "risk": BugRisk.MEDIUM,
116
- "reasoning": "Unknown rule - assess manually",
117
- "impact": "Uncertain impact",
118
- "likelihood": 0.5,
119
- "prevention_steps": ["Review manually", "Check documentation"],
120
- },
121
- )
122
-
123
- return RiskAssessment(
124
- issue=issue,
125
- risk_level=pattern["risk"],
126
- reasoning=pattern["reasoning"],
127
- impact=pattern["impact"],
128
- likelihood=pattern["likelihood"],
129
- prevention_steps=pattern["prevention_steps"],
130
- )
131
-
132
- def _get_eslint_patterns(self) -> dict[str, dict]:
133
- """ESLint rule → bug risk patterns"""
134
- return {
135
- # CRITICAL - Guaranteed runtime errors
136
- "no-undef": {
137
- "risk": BugRisk.CRITICAL,
138
- "reasoning": "Undefined variable will throw ReferenceError at runtime",
139
- "impact": "Application crash when code path executes",
140
- "likelihood": 1.0,
141
- "prevention_steps": [
142
- "Add import/require statement",
143
- "Define variable before use",
144
- "Check for typos in variable name",
145
- ],
146
- },
147
- "no-unreachable": {
148
- "risk": BugRisk.CRITICAL,
149
- "reasoning": "Code after return/throw never executes - logic error",
150
- "impact": "Expected functionality missing",
151
- "likelihood": 1.0,
152
- "prevention_steps": [
153
- "Remove unreachable code",
154
- "Move logic before return statement",
155
- ],
156
- },
157
- # HIGH - Very likely to cause bugs
158
- "eqeqeq": {
159
- "risk": BugRisk.HIGH,
160
- "reasoning": "Type coercion with == causes subtle comparison bugs",
161
- "impact": "Incorrect conditional logic, unexpected behavior",
162
- "likelihood": 0.8,
163
- "prevention_steps": [
164
- "Use === for type-safe comparison",
165
- "Explicitly convert types before comparison",
166
- ],
167
- },
168
- "no-constant-condition": {
169
- "risk": BugRisk.HIGH,
170
- "reasoning": "Constant condition in if/while likely logic error",
171
- "impact": "Dead code or infinite loop",
172
- "likelihood": 0.9,
173
- "prevention_steps": ["Review conditional logic", "Replace with actual condition"],
174
- },
175
- "no-dupe-keys": {
176
- "risk": BugRisk.HIGH,
177
- "reasoning": "Duplicate object keys - later value silently overwrites",
178
- "impact": "Lost data, incorrect object state",
179
- "likelihood": 0.9,
180
- "prevention_steps": ["Remove duplicate key", "Use unique property names"],
181
- },
182
- # MEDIUM - May cause subtle bugs
183
- "no-shadow": {
184
- "risk": BugRisk.MEDIUM,
185
- "reasoning": "Variable shadowing can cause confusion",
186
- "impact": "Using wrong variable in scope",
187
- "likelihood": 0.5,
188
- "prevention_steps": [
189
- "Rename inner variable",
190
- "Use distinct names for different scopes",
191
- ],
192
- },
193
- "no-implicit-coercion": {
194
- "risk": BugRisk.MEDIUM,
195
- "reasoning": "Implicit type coercion can cause unexpected results",
196
- "impact": "Type-related bugs in edge cases",
197
- "likelihood": 0.6,
198
- "prevention_steps": ["Use explicit type conversion", "Add type checks"],
199
- },
200
- # LOW - Unlikely to cause bugs
201
- "no-unused-vars": {
202
- "risk": BugRisk.LOW,
203
- "reasoning": "Unused variables rarely cause bugs, just clutter",
204
- "impact": "Code bloat, slight confusion",
205
- "likelihood": 0.1,
206
- "prevention_steps": [
207
- "Remove unused variable",
208
- "Prefix with _ if intentionally unused",
209
- ],
210
- },
211
- # STYLE - No bug risk
212
- "semi": {
213
- "risk": BugRisk.STYLE,
214
- "reasoning": "Missing semicolon - ASI handles it",
215
- "impact": "None (style preference)",
216
- "likelihood": 0.0,
217
- "prevention_steps": ["Add semicolon for consistency"],
218
- },
219
- "quotes": {
220
- "risk": BugRisk.STYLE,
221
- "reasoning": "Quote style has no functional impact",
222
- "impact": "None (style preference)",
223
- "likelihood": 0.0,
224
- "prevention_steps": ["Use consistent quote style"],
225
- },
226
- }
227
-
228
- def _get_pylint_patterns(self) -> dict[str, dict]:
229
- """Pylint rule → bug risk patterns"""
230
- return {
231
- # CRITICAL
232
- "undefined-variable": {
233
- "risk": BugRisk.CRITICAL,
234
- "reasoning": "Undefined variable will raise NameError",
235
- "impact": "Application crash",
236
- "likelihood": 1.0,
237
- "prevention_steps": ["Import missing module", "Define variable before use"],
238
- },
239
- "used-before-assignment": {
240
- "risk": BugRisk.CRITICAL,
241
- "reasoning": "Variable used before assignment raises UnboundLocalError",
242
- "impact": "Runtime error",
243
- "likelihood": 1.0,
244
- "prevention_steps": ["Initialize variable before use", "Check control flow logic"],
245
- },
246
- # HIGH
247
- "no-member": {
248
- "risk": BugRisk.HIGH,
249
- "reasoning": "Accessing non-existent attribute raises AttributeError",
250
- "impact": "Runtime error when code path executes",
251
- "likelihood": 0.8,
252
- "prevention_steps": [
253
- "Check object has attribute",
254
- "Use hasattr() or getattr()",
255
- "Fix typo in attribute name",
256
- ],
257
- },
258
- "arguments-differ": {
259
- "risk": BugRisk.HIGH,
260
- "reasoning": "Method signature mismatch breaks contract",
261
- "impact": "Incorrect method calls, TypeError",
262
- "likelihood": 0.8,
263
- "prevention_steps": ["Match parent class signature", "Update all callers"],
264
- },
265
- # MEDIUM
266
- "dangerous-default-value": {
267
- "risk": BugRisk.MEDIUM,
268
- "reasoning": "Mutable default arguments share state",
269
- "impact": "Unexpected state persistence across calls",
270
- "likelihood": 0.7,
271
- "prevention_steps": ["Use None as default", "Initialize in function body"],
272
- },
273
- # LOW
274
- "unused-variable": {
275
- "risk": BugRisk.LOW,
276
- "reasoning": "Unused variable is just clutter",
277
- "impact": "Minimal - slight confusion",
278
- "likelihood": 0.1,
279
- "prevention_steps": ["Remove variable", "Prefix with _ if intentional"],
280
- },
281
- # STYLE
282
- "missing-docstring": {
283
- "risk": BugRisk.STYLE,
284
- "reasoning": "Missing documentation, not a bug",
285
- "impact": "None (documentation quality)",
286
- "likelihood": 0.0,
287
- "prevention_steps": ["Add docstring"],
288
- },
289
- "invalid-name": {
290
- "risk": BugRisk.STYLE,
291
- "reasoning": "Naming convention violation",
292
- "impact": "None (style preference)",
293
- "likelihood": 0.0,
294
- "prevention_steps": ["Rename to follow convention"],
295
- },
296
- }
297
-
298
- def _get_typescript_patterns(self) -> dict[str, dict]:
299
- """TypeScript error → bug risk patterns"""
300
- return {
301
- # CRITICAL
302
- "TS2304": { # Cannot find name
303
- "risk": BugRisk.CRITICAL,
304
- "reasoning": "Undefined identifier will cause ReferenceError",
305
- "impact": "Runtime error",
306
- "likelihood": 1.0,
307
- "prevention_steps": ["Import missing type/variable", "Define before use"],
308
- },
309
- "TS2322": { # Type mismatch
310
- "risk": BugRisk.HIGH,
311
- "reasoning": "Type mismatch often indicates logic error",
312
- "impact": "Incorrect value handling, potential runtime errors",
313
- "likelihood": 0.8,
314
- "prevention_steps": ["Fix type mismatch", "Add type conversion", "Review logic"],
315
- },
316
- "TS2345": { # Argument type mismatch
317
- "risk": BugRisk.HIGH,
318
- "reasoning": "Wrong argument type causes incorrect behavior",
319
- "impact": "Function receives unexpected input",
320
- "likelihood": 0.8,
321
- "prevention_steps": ["Fix argument type", "Update function signature"],
322
- },
323
- "TS2339": { # Property doesn't exist
324
- "risk": BugRisk.HIGH,
325
- "reasoning": "Accessing non-existent property",
326
- "impact": "undefined value, potential TypeError",
327
- "likelihood": 0.7,
328
- "prevention_steps": ["Add property to type", "Check property exists", "Fix typo"],
329
- },
330
- }
331
-
332
- def generate_summary(self, assessments: list[RiskAssessment]) -> dict[str, Any]:
333
- """Generate summary of risk assessments.
334
-
335
- This is the Level 4 alert format.
336
- """
337
- # Count by risk level
338
- by_risk: dict[BugRisk, list[RiskAssessment]] = {
339
- BugRisk.CRITICAL: [],
340
- BugRisk.HIGH: [],
341
- BugRisk.MEDIUM: [],
342
- BugRisk.LOW: [],
343
- BugRisk.STYLE: [],
344
- }
345
-
346
- for assessment in assessments:
347
- by_risk[assessment.risk_level].append(assessment)
348
-
349
- # Calculate overall risk score
350
- risk_scores = {
351
- BugRisk.CRITICAL: 10,
352
- BugRisk.HIGH: 5,
353
- BugRisk.MEDIUM: 2,
354
- BugRisk.LOW: 0.5,
355
- BugRisk.STYLE: 0,
356
- }
357
-
358
- total_risk_score = sum(risk_scores[a.risk_level] for a in assessments)
359
-
360
- # Generate alert message
361
- critical_count = len(by_risk[BugRisk.CRITICAL])
362
- high_count = len(by_risk[BugRisk.HIGH])
363
-
364
- alert_level = "NONE"
365
- if critical_count > 0:
366
- alert_level = "CRITICAL"
367
- elif high_count > 0:
368
- alert_level = "HIGH"
369
- elif len(by_risk[BugRisk.MEDIUM]) > 5:
370
- alert_level = "MEDIUM"
371
-
372
- return {
373
- "total_issues": len(assessments),
374
- "by_risk_level": {
375
- "critical": critical_count,
376
- "high": high_count,
377
- "medium": len(by_risk[BugRisk.MEDIUM]),
378
- "low": len(by_risk[BugRisk.LOW]),
379
- "style": len(by_risk[BugRisk.STYLE]),
380
- },
381
- "total_risk_score": total_risk_score,
382
- "alert_level": alert_level,
383
- "top_risks": [a.to_dict() for a in assessments[:5]], # Top 5
384
- "recommendation": self._generate_recommendation(
385
- critical_count,
386
- high_count,
387
- len(by_risk[BugRisk.MEDIUM]),
388
- ),
389
- }
390
-
391
- def _generate_recommendation(self, critical: int, high: int, medium: int) -> str:
392
- """Generate Level 4 recommendation"""
393
- if critical > 0:
394
- return (
395
- f"ALERT: {critical} CRITICAL issues detected. "
396
- "In our experience, these will cause runtime errors. "
397
- "Fix before deployment to prevent production incidents."
398
- )
399
-
400
- if high > 0:
401
- return (
402
- f"WARNING: {high} HIGH-risk issues found. "
403
- "In our experience, these often lead to bugs in production. "
404
- "Recommend fixing before merge."
405
- )
406
-
407
- if medium > 5:
408
- return (
409
- f"NOTICE: {medium} MEDIUM-risk issues accumulating. "
410
- "While not critical, this volume suggests code quality trajectory "
411
- "that may lead to technical debt. Consider addressing soon."
412
- )
413
-
414
- return "Code quality looks good. No high-risk issues detected."