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,395 +0,0 @@
|
|
|
1
|
-
"""Advanced Debugging Wizard (Level 4)
|
|
2
|
-
|
|
3
|
-
Protocol-based debugging using linting configuration pattern.
|
|
4
|
-
|
|
5
|
-
Uses the same systematic approach as linting:
|
|
6
|
-
1. Load config (understand the rules)
|
|
7
|
-
2. Run linter (get complete issue list)
|
|
8
|
-
3. Systematically fix (work through the list)
|
|
9
|
-
4. Verify (re-run to confirm)
|
|
10
|
-
|
|
11
|
-
This implements Level 4 Anticipatory Empathy by:
|
|
12
|
-
- Predicting which violations will cause bugs
|
|
13
|
-
- Alerting to trajectory concerns
|
|
14
|
-
- Recommending prevention steps
|
|
15
|
-
|
|
16
|
-
Copyright 2025 Smart AI Memory, LLC
|
|
17
|
-
Licensed under Fair Source 0.9
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
import logging
|
|
21
|
-
from pathlib import Path
|
|
22
|
-
from typing import Any
|
|
23
|
-
|
|
24
|
-
from .base_wizard import BaseWizard
|
|
25
|
-
from .debugging.bug_risk_analyzer import BugRiskAnalyzer
|
|
26
|
-
from .debugging.config_loaders import load_config
|
|
27
|
-
from .debugging.fix_applier import apply_fixes, group_issues_by_fixability
|
|
28
|
-
from .debugging.language_patterns import get_pattern_library
|
|
29
|
-
from .debugging.linter_parsers import LintIssue, parse_linter_output
|
|
30
|
-
from .debugging.verification import verify_fixes
|
|
31
|
-
|
|
32
|
-
logger = logging.getLogger(__name__)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class AdvancedDebuggingWizard(BaseWizard):
|
|
36
|
-
"""Advanced Debugging Wizard - Level 4 Anticipatory
|
|
37
|
-
|
|
38
|
-
Systematically debugs code using linting configuration pattern:
|
|
39
|
-
- Parses linter output
|
|
40
|
-
- Analyzes bug risk (Level 4)
|
|
41
|
-
- Applies fixes systematically
|
|
42
|
-
- Verifies fixes work
|
|
43
|
-
- Learns cross-language patterns (Level 5)
|
|
44
|
-
"""
|
|
45
|
-
|
|
46
|
-
def __init__(self):
|
|
47
|
-
super().__init__()
|
|
48
|
-
self.bug_analyzer = BugRiskAnalyzer()
|
|
49
|
-
self.pattern_library = get_pattern_library()
|
|
50
|
-
self._name: str = "Advanced Debugging Wizard"
|
|
51
|
-
self._level: int = 4
|
|
52
|
-
|
|
53
|
-
@property
|
|
54
|
-
def name(self) -> str:
|
|
55
|
-
"""Wizard name"""
|
|
56
|
-
return self._name
|
|
57
|
-
|
|
58
|
-
@property
|
|
59
|
-
def level(self) -> int:
|
|
60
|
-
"""Empathy level"""
|
|
61
|
-
return self._level
|
|
62
|
-
|
|
63
|
-
async def analyze(self, context: dict[str, Any]) -> dict[str, Any]:
|
|
64
|
-
"""Analyze code using linting protocols.
|
|
65
|
-
|
|
66
|
-
Context expects:
|
|
67
|
-
- project_path: Path to project
|
|
68
|
-
- linters: Dict of {linter_name: output_file_or_string}
|
|
69
|
-
- configs: Dict of {linter_name: config_file} (optional)
|
|
70
|
-
- auto_fix: bool (whether to apply auto-fixes)
|
|
71
|
-
- verify: bool (whether to re-run linters)
|
|
72
|
-
|
|
73
|
-
Returns:
|
|
74
|
-
Analysis with issues, risk assessment, fixes, and verification
|
|
75
|
-
|
|
76
|
-
"""
|
|
77
|
-
project_path = context.get("project_path", ".")
|
|
78
|
-
linters = context.get("linters", {})
|
|
79
|
-
configs = context.get("configs", {})
|
|
80
|
-
auto_fix = context.get("auto_fix", False)
|
|
81
|
-
verify = context.get("verify", False)
|
|
82
|
-
|
|
83
|
-
if not linters:
|
|
84
|
-
return {
|
|
85
|
-
"error": "No linter outputs provided",
|
|
86
|
-
"help": "Provide linters dict: {'eslint': 'output.json', ...}",
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
# Phase 1: Parse linter outputs
|
|
90
|
-
all_issues = []
|
|
91
|
-
linter_results = {}
|
|
92
|
-
|
|
93
|
-
for linter_name, output_source in linters.items():
|
|
94
|
-
logger.info(f"Parsing {linter_name} output...")
|
|
95
|
-
|
|
96
|
-
# Check if output_source is a file or string
|
|
97
|
-
if Path(output_source).exists():
|
|
98
|
-
with open(output_source) as f:
|
|
99
|
-
output = f.read()
|
|
100
|
-
else:
|
|
101
|
-
output = output_source
|
|
102
|
-
|
|
103
|
-
issues = parse_linter_output(linter_name, output)
|
|
104
|
-
all_issues.extend(issues)
|
|
105
|
-
|
|
106
|
-
linter_results[linter_name] = {"total_issues": len(issues), "issues": issues}
|
|
107
|
-
|
|
108
|
-
# Phase 2: Load configs (understand the rules)
|
|
109
|
-
configs_loaded = {}
|
|
110
|
-
for linter_name in linters.keys():
|
|
111
|
-
config_file = configs.get(linter_name)
|
|
112
|
-
config = load_config(linter_name, config_path=config_file, start_dir=project_path)
|
|
113
|
-
|
|
114
|
-
if config:
|
|
115
|
-
configs_loaded[linter_name] = {
|
|
116
|
-
"file": config.config_file,
|
|
117
|
-
"rules_count": len(config.rules),
|
|
118
|
-
"extends": config.extends,
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
# Phase 3: Risk analysis (Level 4 - Anticipatory)
|
|
122
|
-
logger.info("Analyzing bug risks...")
|
|
123
|
-
risk_assessments = self.bug_analyzer.analyze(all_issues)
|
|
124
|
-
risk_summary = self.bug_analyzer.generate_summary(risk_assessments)
|
|
125
|
-
|
|
126
|
-
# Phase 4: Group by fixability
|
|
127
|
-
fixability_by_linter = {}
|
|
128
|
-
for linter_name, result in linter_results.items():
|
|
129
|
-
issues_for_fixability: list[LintIssue] = result["issues"] # type: ignore[assignment]
|
|
130
|
-
fixability = group_issues_by_fixability(linter_name, issues_for_fixability)
|
|
131
|
-
fixability_by_linter[linter_name] = {
|
|
132
|
-
"auto_fixable": len(fixability["auto_fixable"]),
|
|
133
|
-
"manual": len(fixability["manual"]),
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
# Phase 5: Apply fixes (if requested)
|
|
137
|
-
fix_results = {}
|
|
138
|
-
if auto_fix:
|
|
139
|
-
logger.info("Applying auto-fixes...")
|
|
140
|
-
|
|
141
|
-
for linter_name, result in linter_results.items():
|
|
142
|
-
issues_for_fixing: list[LintIssue] = result["issues"] # type: ignore[assignment]
|
|
143
|
-
fixes = apply_fixes(linter_name, issues_for_fixing, dry_run=False, auto_only=True)
|
|
144
|
-
|
|
145
|
-
successful = [f for f in fixes if f.success]
|
|
146
|
-
failed = [f for f in fixes if not f.success]
|
|
147
|
-
|
|
148
|
-
fix_results[linter_name] = {
|
|
149
|
-
"attempted": len(fixes),
|
|
150
|
-
"successful": len(successful),
|
|
151
|
-
"failed": len(failed),
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
# Phase 6: Verification (if requested)
|
|
155
|
-
verification_results = {}
|
|
156
|
-
if verify:
|
|
157
|
-
logger.info("Verifying fixes...")
|
|
158
|
-
|
|
159
|
-
for linter_name, result in linter_results.items():
|
|
160
|
-
issues_for_verification: list[LintIssue] = result["issues"] # type: ignore[assignment]
|
|
161
|
-
verification = verify_fixes(linter_name, project_path, issues_for_verification)
|
|
162
|
-
|
|
163
|
-
verification_results[linter_name] = verification.to_dict()
|
|
164
|
-
|
|
165
|
-
# Phase 7: Cross-language insights (Level 5)
|
|
166
|
-
cross_language_insights = self._generate_cross_language_insights(all_issues)
|
|
167
|
-
|
|
168
|
-
# Phase 8: Trajectory analysis (Level 4)
|
|
169
|
-
trajectory = self._analyze_trajectory(all_issues, risk_summary)
|
|
170
|
-
|
|
171
|
-
# Build final result
|
|
172
|
-
return {
|
|
173
|
-
"issues_found": len(all_issues),
|
|
174
|
-
"linters": linter_results,
|
|
175
|
-
"configs": configs_loaded,
|
|
176
|
-
# Level 4: Risk analysis
|
|
177
|
-
"risk_assessment": risk_summary,
|
|
178
|
-
# Fixability
|
|
179
|
-
"fixability": fixability_by_linter,
|
|
180
|
-
# Fixes applied (if auto_fix=True)
|
|
181
|
-
"fixes": fix_results if auto_fix else None,
|
|
182
|
-
# Verification (if verify=True)
|
|
183
|
-
"verification": verification_results if verify else None,
|
|
184
|
-
# Level 5: Cross-language patterns
|
|
185
|
-
"cross_language_insights": cross_language_insights,
|
|
186
|
-
# Level 4: Trajectory prediction
|
|
187
|
-
"trajectory": trajectory,
|
|
188
|
-
# Standard wizard outputs
|
|
189
|
-
"predictions": self._generate_predictions(trajectory, risk_summary),
|
|
190
|
-
"recommendations": self._generate_recommendations(
|
|
191
|
-
risk_summary,
|
|
192
|
-
fixability_by_linter,
|
|
193
|
-
trajectory,
|
|
194
|
-
),
|
|
195
|
-
"patterns": cross_language_insights,
|
|
196
|
-
"confidence": 0.9,
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
def _generate_cross_language_insights(self, issues: list[LintIssue]) -> list[dict[str, Any]]:
|
|
200
|
-
"""Generate Level 5 cross-language insights.
|
|
201
|
-
|
|
202
|
-
Find patterns that exist across multiple languages in this project.
|
|
203
|
-
"""
|
|
204
|
-
insights = []
|
|
205
|
-
|
|
206
|
-
# Group issues by language
|
|
207
|
-
by_language: dict[str, list[LintIssue]] = {}
|
|
208
|
-
for issue in issues:
|
|
209
|
-
lang = issue.linter
|
|
210
|
-
if lang not in by_language:
|
|
211
|
-
by_language[lang] = []
|
|
212
|
-
by_language[lang].append(issue)
|
|
213
|
-
|
|
214
|
-
# Find common patterns
|
|
215
|
-
if len(by_language) >= 2:
|
|
216
|
-
# Look for same pattern in different languages
|
|
217
|
-
for issue in issues[:5]: # Check top 5
|
|
218
|
-
pattern = self.pattern_library.find_pattern_for_rule(issue.linter, issue.rule)
|
|
219
|
-
|
|
220
|
-
if pattern:
|
|
221
|
-
# Check if this pattern appears in other languages
|
|
222
|
-
other_langs = [lang for lang in by_language if lang != issue.linter]
|
|
223
|
-
|
|
224
|
-
if other_langs:
|
|
225
|
-
insight = {
|
|
226
|
-
"pattern_name": pattern.name,
|
|
227
|
-
"found_in": issue.linter,
|
|
228
|
-
"also_applies_to": other_langs,
|
|
229
|
-
"description": pattern.description,
|
|
230
|
-
"universal_strategy": pattern.universal_fix_strategy,
|
|
231
|
-
}
|
|
232
|
-
insights.append(insight)
|
|
233
|
-
|
|
234
|
-
return insights[:3] # Top 3 insights
|
|
235
|
-
|
|
236
|
-
def _analyze_trajectory(
|
|
237
|
-
self,
|
|
238
|
-
issues: list[LintIssue],
|
|
239
|
-
risk_summary: dict[str, Any],
|
|
240
|
-
) -> dict[str, Any]:
|
|
241
|
-
"""Analyze issue trajectory (Level 4).
|
|
242
|
-
|
|
243
|
-
Predict where code quality is headed.
|
|
244
|
-
"""
|
|
245
|
-
total_issues = len(issues)
|
|
246
|
-
critical = risk_summary["by_risk_level"]["critical"]
|
|
247
|
-
high = risk_summary["by_risk_level"]["high"]
|
|
248
|
-
_ = risk_summary["by_risk_level"]["medium"]
|
|
249
|
-
|
|
250
|
-
# Simple trajectory analysis
|
|
251
|
-
# In real implementation, would compare with historical data
|
|
252
|
-
trajectory_state = "stable"
|
|
253
|
-
trajectory_concern = None
|
|
254
|
-
|
|
255
|
-
if critical > 0:
|
|
256
|
-
trajectory_state = "critical"
|
|
257
|
-
trajectory_concern = (
|
|
258
|
-
f"{critical} critical issues will cause production failures. "
|
|
259
|
-
"Immediate action required."
|
|
260
|
-
)
|
|
261
|
-
elif high > 5:
|
|
262
|
-
trajectory_state = "degrading"
|
|
263
|
-
trajectory_concern = (
|
|
264
|
-
f"{high} high-risk issues accumulating. "
|
|
265
|
-
"In our experience, this volume leads to production bugs."
|
|
266
|
-
)
|
|
267
|
-
elif total_issues > 50:
|
|
268
|
-
trajectory_state = "concerning"
|
|
269
|
-
trajectory_concern = (
|
|
270
|
-
f"{total_issues} total issues. "
|
|
271
|
-
"Code quality trajectory suggests tech debt accumulation."
|
|
272
|
-
)
|
|
273
|
-
|
|
274
|
-
return {
|
|
275
|
-
"state": trajectory_state,
|
|
276
|
-
"total_issues": total_issues,
|
|
277
|
-
"critical_issues": critical,
|
|
278
|
-
"high_risk_issues": high,
|
|
279
|
-
"concern": trajectory_concern,
|
|
280
|
-
"recommendation": self._get_trajectory_recommendation(trajectory_state),
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
def _get_trajectory_recommendation(self, state: str) -> str:
|
|
284
|
-
"""Get recommendation based on trajectory state"""
|
|
285
|
-
recommendations = {
|
|
286
|
-
"critical": "Fix critical issues before deployment. Production failure likely.",
|
|
287
|
-
"degrading": "Address high-risk issues soon. Trajectory suggests increasing bug density.",
|
|
288
|
-
"concerning": "Consider code quality review. Volume of issues may indicate systemic issues.",
|
|
289
|
-
"stable": "Code quality trajectory looks good. Continue current practices.",
|
|
290
|
-
}
|
|
291
|
-
return recommendations.get(state, "")
|
|
292
|
-
|
|
293
|
-
def _generate_predictions(
|
|
294
|
-
self,
|
|
295
|
-
trajectory: dict[str, Any],
|
|
296
|
-
risk_summary: dict[str, Any],
|
|
297
|
-
) -> list[dict[str, Any]]:
|
|
298
|
-
"""Generate Level 4 predictions"""
|
|
299
|
-
predictions = []
|
|
300
|
-
|
|
301
|
-
# Predict based on critical issues
|
|
302
|
-
if risk_summary["by_risk_level"]["critical"] > 0:
|
|
303
|
-
predictions.append(
|
|
304
|
-
{
|
|
305
|
-
"type": "production_failure_risk",
|
|
306
|
-
"severity": "critical",
|
|
307
|
-
"description": (
|
|
308
|
-
"Critical linting violations detected. "
|
|
309
|
-
"In our experience, these cause runtime errors."
|
|
310
|
-
),
|
|
311
|
-
"prevention_steps": [
|
|
312
|
-
"Fix all critical issues before deployment",
|
|
313
|
-
"Add pre-commit hooks to catch these",
|
|
314
|
-
"Review why these weren't caught earlier",
|
|
315
|
-
],
|
|
316
|
-
},
|
|
317
|
-
)
|
|
318
|
-
|
|
319
|
-
# Predict based on high-risk accumulation
|
|
320
|
-
high_risk = risk_summary["by_risk_level"]["high"]
|
|
321
|
-
if high_risk > 5:
|
|
322
|
-
predictions.append(
|
|
323
|
-
{
|
|
324
|
-
"type": "bug_density_increase",
|
|
325
|
-
"severity": "high",
|
|
326
|
-
"description": (
|
|
327
|
-
f"{high_risk} high-risk issues found. "
|
|
328
|
-
"In our experience, this volume correlates with production bugs."
|
|
329
|
-
),
|
|
330
|
-
"prevention_steps": [
|
|
331
|
-
"Prioritize high-risk fixes",
|
|
332
|
-
"Add linting to CI/CD",
|
|
333
|
-
"Consider pair programming for complex areas",
|
|
334
|
-
],
|
|
335
|
-
},
|
|
336
|
-
)
|
|
337
|
-
|
|
338
|
-
# Predict based on trajectory
|
|
339
|
-
if trajectory["state"] in ["degrading", "concerning"]:
|
|
340
|
-
predictions.append(
|
|
341
|
-
{
|
|
342
|
-
"type": "technical_debt_accumulation",
|
|
343
|
-
"severity": "medium",
|
|
344
|
-
"description": trajectory["concern"],
|
|
345
|
-
"prevention_steps": [
|
|
346
|
-
"Schedule code quality review",
|
|
347
|
-
"Allocate time for systematic cleanup",
|
|
348
|
-
"Update coding standards documentation",
|
|
349
|
-
],
|
|
350
|
-
},
|
|
351
|
-
)
|
|
352
|
-
|
|
353
|
-
return predictions
|
|
354
|
-
|
|
355
|
-
def _generate_recommendations(
|
|
356
|
-
self,
|
|
357
|
-
risk_summary: dict[str, Any],
|
|
358
|
-
fixability: dict[str, dict],
|
|
359
|
-
trajectory: dict[str, Any],
|
|
360
|
-
) -> list[str]:
|
|
361
|
-
"""Generate actionable recommendations"""
|
|
362
|
-
recommendations = []
|
|
363
|
-
|
|
364
|
-
# Based on alert level
|
|
365
|
-
alert_level = risk_summary["alert_level"]
|
|
366
|
-
|
|
367
|
-
if alert_level == "CRITICAL":
|
|
368
|
-
recommendations.append(
|
|
369
|
-
f"🚨 CRITICAL: Fix {risk_summary['by_risk_level']['critical']} "
|
|
370
|
-
"critical issues immediately",
|
|
371
|
-
)
|
|
372
|
-
|
|
373
|
-
if alert_level in ["CRITICAL", "HIGH"]:
|
|
374
|
-
recommendations.append(
|
|
375
|
-
f"⚠️ Address {risk_summary['by_risk_level']['high']} high-risk issues before merge",
|
|
376
|
-
)
|
|
377
|
-
|
|
378
|
-
# Based on fixability
|
|
379
|
-
total_auto_fixable = sum(f["auto_fixable"] for f in fixability.values())
|
|
380
|
-
|
|
381
|
-
if total_auto_fixable > 0:
|
|
382
|
-
recommendations.append(
|
|
383
|
-
f"✅ {total_auto_fixable} issues can be auto-fixed. Run with auto_fix=True",
|
|
384
|
-
)
|
|
385
|
-
|
|
386
|
-
# Based on trajectory
|
|
387
|
-
if trajectory["state"] != "stable":
|
|
388
|
-
recommendations.append(f"📊 Trajectory: {trajectory['recommendation']}")
|
|
389
|
-
|
|
390
|
-
# General recommendations
|
|
391
|
-
recommendations.append("🔧 Add pre-commit hooks to prevent future issues")
|
|
392
|
-
|
|
393
|
-
recommendations.append("📝 Document common patterns in team style guide")
|
|
394
|
-
|
|
395
|
-
return recommendations
|