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.
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/METADATA +7 -6
- empathy_framework-4.7.0.dist-info/RECORD +354 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/top_level.txt +0 -2
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
- empathy_llm_toolkit/agent_factory/__init__.py +6 -6
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
- empathy_llm_toolkit/agents_md/__init__.py +22 -0
- empathy_llm_toolkit/agents_md/loader.py +218 -0
- empathy_llm_toolkit/agents_md/parser.py +271 -0
- empathy_llm_toolkit/agents_md/registry.py +307 -0
- empathy_llm_toolkit/commands/__init__.py +51 -0
- empathy_llm_toolkit/commands/context.py +375 -0
- empathy_llm_toolkit/commands/loader.py +301 -0
- empathy_llm_toolkit/commands/models.py +231 -0
- empathy_llm_toolkit/commands/parser.py +371 -0
- empathy_llm_toolkit/commands/registry.py +429 -0
- empathy_llm_toolkit/config/__init__.py +8 -8
- empathy_llm_toolkit/config/unified.py +3 -7
- empathy_llm_toolkit/context/__init__.py +22 -0
- empathy_llm_toolkit/context/compaction.py +455 -0
- empathy_llm_toolkit/context/manager.py +434 -0
- empathy_llm_toolkit/hooks/__init__.py +24 -0
- empathy_llm_toolkit/hooks/config.py +306 -0
- empathy_llm_toolkit/hooks/executor.py +289 -0
- empathy_llm_toolkit/hooks/registry.py +302 -0
- empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
- empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
- empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
- empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
- empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
- empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
- empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
- empathy_llm_toolkit/learning/__init__.py +30 -0
- empathy_llm_toolkit/learning/evaluator.py +438 -0
- empathy_llm_toolkit/learning/extractor.py +514 -0
- empathy_llm_toolkit/learning/storage.py +560 -0
- empathy_llm_toolkit/providers.py +4 -11
- empathy_llm_toolkit/security/__init__.py +17 -17
- empathy_llm_toolkit/utils/tokens.py +2 -5
- empathy_os/__init__.py +202 -70
- empathy_os/cache_monitor.py +5 -3
- empathy_os/cli/__init__.py +11 -55
- empathy_os/cli/__main__.py +29 -15
- empathy_os/cli/commands/inspection.py +21 -12
- empathy_os/cli/commands/memory.py +4 -12
- empathy_os/cli/commands/profiling.py +198 -0
- empathy_os/cli/commands/utilities.py +27 -7
- empathy_os/cli.py +28 -57
- empathy_os/cli_unified.py +525 -1164
- empathy_os/cost_tracker.py +9 -3
- empathy_os/dashboard/server.py +200 -2
- empathy_os/hot_reload/__init__.py +7 -7
- empathy_os/hot_reload/config.py +6 -7
- empathy_os/hot_reload/integration.py +35 -35
- empathy_os/hot_reload/reloader.py +57 -57
- empathy_os/hot_reload/watcher.py +28 -28
- empathy_os/hot_reload/websocket.py +2 -2
- empathy_os/memory/__init__.py +11 -4
- empathy_os/memory/claude_memory.py +1 -1
- empathy_os/memory/cross_session.py +8 -12
- empathy_os/memory/edges.py +6 -6
- empathy_os/memory/file_session.py +770 -0
- empathy_os/memory/graph.py +30 -30
- empathy_os/memory/nodes.py +6 -6
- empathy_os/memory/short_term.py +15 -9
- empathy_os/memory/unified.py +606 -140
- empathy_os/meta_workflows/agent_creator.py +3 -9
- empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
- empathy_os/meta_workflows/form_engine.py +6 -18
- empathy_os/meta_workflows/intent_detector.py +64 -24
- empathy_os/meta_workflows/models.py +3 -1
- empathy_os/meta_workflows/pattern_learner.py +13 -31
- empathy_os/meta_workflows/plan_generator.py +55 -47
- empathy_os/meta_workflows/session_context.py +2 -3
- empathy_os/meta_workflows/workflow.py +20 -51
- empathy_os/models/cli.py +2 -2
- empathy_os/models/tasks.py +1 -2
- empathy_os/models/telemetry.py +4 -1
- empathy_os/models/token_estimator.py +3 -1
- empathy_os/monitoring/alerts.py +938 -9
- empathy_os/monitoring/alerts_cli.py +346 -183
- empathy_os/orchestration/execution_strategies.py +12 -29
- empathy_os/orchestration/pattern_learner.py +20 -26
- empathy_os/orchestration/real_tools.py +6 -15
- empathy_os/platform_utils.py +2 -1
- empathy_os/plugins/__init__.py +2 -2
- empathy_os/plugins/base.py +64 -64
- empathy_os/plugins/registry.py +32 -32
- empathy_os/project_index/index.py +49 -15
- empathy_os/project_index/models.py +1 -2
- empathy_os/project_index/reports.py +1 -1
- empathy_os/project_index/scanner.py +1 -0
- empathy_os/redis_memory.py +10 -7
- empathy_os/resilience/__init__.py +1 -1
- empathy_os/resilience/health.py +10 -10
- empathy_os/routing/__init__.py +7 -7
- empathy_os/routing/chain_executor.py +37 -37
- empathy_os/routing/classifier.py +36 -36
- empathy_os/routing/smart_router.py +40 -40
- empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
- empathy_os/scaffolding/__init__.py +8 -8
- empathy_os/scaffolding/__main__.py +1 -1
- empathy_os/scaffolding/cli.py +28 -28
- empathy_os/socratic/__init__.py +3 -19
- empathy_os/socratic/ab_testing.py +25 -36
- empathy_os/socratic/blueprint.py +38 -38
- empathy_os/socratic/cli.py +34 -20
- empathy_os/socratic/collaboration.py +30 -28
- empathy_os/socratic/domain_templates.py +9 -1
- empathy_os/socratic/embeddings.py +17 -13
- empathy_os/socratic/engine.py +135 -70
- empathy_os/socratic/explainer.py +70 -60
- empathy_os/socratic/feedback.py +24 -19
- empathy_os/socratic/forms.py +15 -10
- empathy_os/socratic/generator.py +51 -35
- empathy_os/socratic/llm_analyzer.py +25 -23
- empathy_os/socratic/mcp_server.py +99 -159
- empathy_os/socratic/session.py +19 -13
- empathy_os/socratic/storage.py +98 -67
- empathy_os/socratic/success.py +38 -27
- empathy_os/socratic/visual_editor.py +51 -39
- empathy_os/socratic/web_ui.py +99 -66
- empathy_os/telemetry/cli.py +3 -1
- empathy_os/telemetry/usage_tracker.py +1 -3
- empathy_os/test_generator/__init__.py +3 -3
- empathy_os/test_generator/cli.py +28 -28
- empathy_os/test_generator/generator.py +64 -66
- empathy_os/test_generator/risk_analyzer.py +11 -11
- empathy_os/vscode_bridge.py +173 -0
- empathy_os/workflows/__init__.py +212 -120
- empathy_os/workflows/batch_processing.py +8 -24
- empathy_os/workflows/bug_predict.py +1 -1
- empathy_os/workflows/code_review.py +20 -5
- empathy_os/workflows/code_review_pipeline.py +13 -8
- empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
- empathy_os/workflows/manage_documentation.py +1 -0
- empathy_os/workflows/orchestrated_health_check.py +6 -11
- empathy_os/workflows/orchestrated_release_prep.py +3 -3
- empathy_os/workflows/pr_review.py +18 -10
- empathy_os/workflows/progressive/__init__.py +2 -12
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen.py +29 -48
- empathy_os/workflows/progressive/workflow.py +31 -70
- empathy_os/workflows/release_prep.py +21 -6
- empathy_os/workflows/release_prep_crew.py +1 -0
- empathy_os/workflows/secure_release.py +13 -6
- empathy_os/workflows/security_audit.py +8 -3
- empathy_os/workflows/test_coverage_boost_crew.py +3 -2
- empathy_os/workflows/test_maintenance_crew.py +1 -0
- empathy_os/workflows/test_runner.py +16 -12
- empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
- empathy_software_plugin/cli.py +0 -122
- coach_wizards/__init__.py +0 -45
- coach_wizards/accessibility_wizard.py +0 -91
- coach_wizards/api_wizard.py +0 -91
- coach_wizards/base_wizard.py +0 -209
- coach_wizards/cicd_wizard.py +0 -91
- coach_wizards/code_reviewer_README.md +0 -60
- coach_wizards/code_reviewer_wizard.py +0 -180
- coach_wizards/compliance_wizard.py +0 -91
- coach_wizards/database_wizard.py +0 -91
- coach_wizards/debugging_wizard.py +0 -91
- coach_wizards/documentation_wizard.py +0 -91
- coach_wizards/generate_wizards.py +0 -347
- coach_wizards/localization_wizard.py +0 -173
- coach_wizards/migration_wizard.py +0 -91
- coach_wizards/monitoring_wizard.py +0 -91
- coach_wizards/observability_wizard.py +0 -91
- coach_wizards/performance_wizard.py +0 -91
- coach_wizards/prompt_engineering_wizard.py +0 -661
- coach_wizards/refactoring_wizard.py +0 -91
- coach_wizards/scaling_wizard.py +0 -90
- coach_wizards/security_wizard.py +0 -92
- coach_wizards/testing_wizard.py +0 -91
- empathy_framework-4.6.6.dist-info/RECORD +0 -410
- empathy_llm_toolkit/wizards/__init__.py +0 -43
- empathy_llm_toolkit/wizards/base_wizard.py +0 -364
- empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
- empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
- empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
- empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
- empathy_os/wizard_factory_cli.py +0 -170
- empathy_software_plugin/wizards/__init__.py +0 -42
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
- empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
- empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
- empathy_software_plugin/wizards/base_wizard.py +0 -288
- empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
- empathy_software_plugin/wizards/code_review_wizard.py +0 -604
- empathy_software_plugin/wizards/debugging/__init__.py +0 -50
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
- empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
- empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
- empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
- empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
- empathy_software_plugin/wizards/debugging/verification.py +0 -369
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
- empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
- empathy_software_plugin/wizards/performance/__init__.py +0 -9
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
- empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
- empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
- empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
- empathy_software_plugin/wizards/security/__init__.py +0 -32
- empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
- empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
- empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
- empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
- empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
- empathy_software_plugin/wizards/testing/__init__.py +0 -27
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
- empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
- empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
- empathy_software_plugin/wizards/testing_wizard.py +0 -274
- wizards/__init__.py +0 -82
- wizards/admission_assessment_wizard.py +0 -644
- wizards/care_plan.py +0 -321
- wizards/clinical_assessment.py +0 -769
- wizards/discharge_planning.py +0 -77
- wizards/discharge_summary_wizard.py +0 -468
- wizards/dosage_calculation.py +0 -497
- wizards/incident_report_wizard.py +0 -454
- wizards/medication_reconciliation.py +0 -85
- wizards/nursing_assessment.py +0 -171
- wizards/patient_education.py +0 -654
- wizards/quality_improvement.py +0 -705
- wizards/sbar_report.py +0 -324
- wizards/sbar_wizard.py +0 -608
- wizards/shift_handoff_wizard.py +0 -535
- wizards/soap_note_wizard.py +0 -679
- wizards/treatment_plan.py +0 -15
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/entry_points.txt +0 -0
- {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."
|