empathy-framework 3.7.0__py3-none-any.whl → 3.8.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.
- coach_wizards/code_reviewer_README.md +60 -0
- coach_wizards/code_reviewer_wizard.py +180 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/METADATA +148 -11
- empathy_framework-3.8.0.dist-info/RECORD +333 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/top_level.txt +5 -1
- empathy_healthcare_plugin/monitors/__init__.py +9 -0
- empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
- empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
- empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
- empathy_llm_toolkit/agent_factory/__init__.py +53 -0
- empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
- empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
- empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
- empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
- empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
- empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
- empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
- empathy_llm_toolkit/agent_factory/base.py +305 -0
- empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
- empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
- empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
- empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
- empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
- empathy_llm_toolkit/agent_factory/decorators.py +286 -0
- empathy_llm_toolkit/agent_factory/factory.py +558 -0
- empathy_llm_toolkit/agent_factory/framework.py +192 -0
- empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
- empathy_llm_toolkit/agent_factory/resilient.py +320 -0
- empathy_llm_toolkit/cli/__init__.py +8 -0
- empathy_llm_toolkit/cli/sync_claude.py +487 -0
- empathy_llm_toolkit/code_health.py +150 -3
- empathy_llm_toolkit/config/__init__.py +29 -0
- empathy_llm_toolkit/config/unified.py +295 -0
- empathy_llm_toolkit/routing/__init__.py +32 -0
- empathy_llm_toolkit/routing/model_router.py +362 -0
- empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
- empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
- empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
- empathy_llm_toolkit/security/README.md +262 -0
- empathy_llm_toolkit/security/__init__.py +62 -0
- empathy_llm_toolkit/security/audit_logger.py +929 -0
- empathy_llm_toolkit/security/audit_logger_example.py +152 -0
- empathy_llm_toolkit/security/pii_scrubber.py +640 -0
- empathy_llm_toolkit/security/secrets_detector.py +678 -0
- empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
- empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
- empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
- empathy_llm_toolkit/wizards/__init__.py +38 -0
- empathy_llm_toolkit/wizards/base_wizard.py +364 -0
- empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
- empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
- empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
- empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
- empathy_os/__init__.py +52 -52
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/cache/__init__.py +117 -0
- empathy_os/cache/base.py +166 -0
- empathy_os/cache/dependency_manager.py +253 -0
- empathy_os/cache/hash_only.py +248 -0
- empathy_os/cache/hybrid.py +390 -0
- empathy_os/cache/storage.py +282 -0
- empathy_os/cli.py +118 -8
- empathy_os/cli_unified.py +121 -1
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/config.py +2 -1
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/memory/__init__.py +195 -0
- empathy_os/memory/claude_memory.py +466 -0
- empathy_os/memory/config.py +224 -0
- empathy_os/memory/control_panel.py +1298 -0
- empathy_os/memory/edges.py +179 -0
- empathy_os/memory/graph.py +567 -0
- empathy_os/memory/long_term.py +1194 -0
- empathy_os/memory/nodes.py +179 -0
- empathy_os/memory/redis_bootstrap.py +540 -0
- empathy_os/memory/security/__init__.py +31 -0
- empathy_os/memory/security/audit_logger.py +930 -0
- empathy_os/memory/security/pii_scrubber.py +640 -0
- empathy_os/memory/security/secrets_detector.py +678 -0
- empathy_os/memory/short_term.py +2119 -0
- empathy_os/memory/storage/__init__.py +15 -0
- empathy_os/memory/summary_index.py +583 -0
- empathy_os/memory/unified.py +619 -0
- empathy_os/metrics/__init__.py +12 -0
- empathy_os/metrics/prompt_metrics.py +190 -0
- empathy_os/models/__init__.py +136 -0
- empathy_os/models/__main__.py +13 -0
- empathy_os/models/cli.py +655 -0
- empathy_os/models/empathy_executor.py +354 -0
- empathy_os/models/executor.py +252 -0
- empathy_os/models/fallback.py +671 -0
- empathy_os/models/provider_config.py +563 -0
- empathy_os/models/registry.py +382 -0
- empathy_os/models/tasks.py +302 -0
- empathy_os/models/telemetry.py +548 -0
- empathy_os/models/token_estimator.py +378 -0
- empathy_os/models/validation.py +274 -0
- empathy_os/monitoring/__init__.py +52 -0
- empathy_os/monitoring/alerts.py +23 -0
- empathy_os/monitoring/alerts_cli.py +268 -0
- empathy_os/monitoring/multi_backend.py +271 -0
- empathy_os/monitoring/otel_backend.py +363 -0
- empathy_os/optimization/__init__.py +19 -0
- empathy_os/optimization/context_optimizer.py +272 -0
- empathy_os/plugins/__init__.py +28 -0
- empathy_os/plugins/base.py +361 -0
- empathy_os/plugins/registry.py +268 -0
- empathy_os/project_index/__init__.py +30 -0
- empathy_os/project_index/cli.py +335 -0
- empathy_os/project_index/crew_integration.py +430 -0
- empathy_os/project_index/index.py +425 -0
- empathy_os/project_index/models.py +501 -0
- empathy_os/project_index/reports.py +473 -0
- empathy_os/project_index/scanner.py +538 -0
- empathy_os/prompts/__init__.py +61 -0
- empathy_os/prompts/config.py +77 -0
- empathy_os/prompts/context.py +177 -0
- empathy_os/prompts/parser.py +285 -0
- empathy_os/prompts/registry.py +313 -0
- empathy_os/prompts/templates.py +208 -0
- empathy_os/resilience/__init__.py +56 -0
- empathy_os/resilience/circuit_breaker.py +256 -0
- empathy_os/resilience/fallback.py +179 -0
- empathy_os/resilience/health.py +300 -0
- empathy_os/resilience/retry.py +209 -0
- empathy_os/resilience/timeout.py +135 -0
- empathy_os/routing/__init__.py +43 -0
- empathy_os/routing/chain_executor.py +433 -0
- empathy_os/routing/classifier.py +217 -0
- empathy_os/routing/smart_router.py +234 -0
- empathy_os/routing/wizard_registry.py +307 -0
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/validation/__init__.py +19 -0
- empathy_os/validation/xml_validator.py +281 -0
- empathy_os/wizard_factory_cli.py +170 -0
- empathy_os/workflows/__init__.py +360 -0
- empathy_os/workflows/base.py +1660 -0
- empathy_os/workflows/bug_predict.py +962 -0
- empathy_os/workflows/code_review.py +960 -0
- empathy_os/workflows/code_review_adapters.py +310 -0
- empathy_os/workflows/code_review_pipeline.py +720 -0
- empathy_os/workflows/config.py +600 -0
- empathy_os/workflows/dependency_check.py +648 -0
- empathy_os/workflows/document_gen.py +1069 -0
- empathy_os/workflows/documentation_orchestrator.py +1205 -0
- empathy_os/workflows/health_check.py +679 -0
- empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
- empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
- empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
- empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
- empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
- empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
- empathy_os/workflows/manage_documentation.py +804 -0
- empathy_os/workflows/new_sample_workflow1.py +146 -0
- empathy_os/workflows/new_sample_workflow1_README.md +150 -0
- empathy_os/workflows/perf_audit.py +687 -0
- empathy_os/workflows/pr_review.py +748 -0
- empathy_os/workflows/progress.py +445 -0
- empathy_os/workflows/progress_server.py +322 -0
- empathy_os/workflows/refactor_plan.py +693 -0
- empathy_os/workflows/release_prep.py +808 -0
- empathy_os/workflows/research_synthesis.py +404 -0
- empathy_os/workflows/secure_release.py +585 -0
- empathy_os/workflows/security_adapters.py +297 -0
- empathy_os/workflows/security_audit.py +1046 -0
- empathy_os/workflows/step_config.py +234 -0
- empathy_os/workflows/test5.py +125 -0
- empathy_os/workflows/test5_README.md +158 -0
- empathy_os/workflows/test_gen.py +1855 -0
- empathy_os/workflows/test_lifecycle.py +526 -0
- empathy_os/workflows/test_maintenance.py +626 -0
- empathy_os/workflows/test_maintenance_cli.py +590 -0
- empathy_os/workflows/test_maintenance_crew.py +821 -0
- empathy_os/workflows/xml_enhanced_crew.py +285 -0
- empathy_software_plugin/cli/__init__.py +120 -0
- empathy_software_plugin/cli/inspect.py +362 -0
- empathy_software_plugin/cli.py +3 -1
- empathy_software_plugin/wizards/__init__.py +42 -0
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
- empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
- empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
- empathy_software_plugin/wizards/base_wizard.py +288 -0
- empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
- empathy_software_plugin/wizards/code_review_wizard.py +606 -0
- empathy_software_plugin/wizards/debugging/__init__.py +50 -0
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
- empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
- empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
- empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
- empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
- empathy_software_plugin/wizards/debugging/verification.py +369 -0
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
- empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
- empathy_software_plugin/wizards/performance/__init__.py +9 -0
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
- empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
- empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
- empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
- empathy_software_plugin/wizards/security/__init__.py +32 -0
- empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
- empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
- empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
- empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
- empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
- empathy_software_plugin/wizards/testing/__init__.py +27 -0
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
- empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
- empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
- empathy_software_plugin/wizards/testing_wizard.py +274 -0
- hot_reload/README.md +473 -0
- hot_reload/__init__.py +62 -0
- hot_reload/config.py +84 -0
- hot_reload/integration.py +228 -0
- hot_reload/reloader.py +298 -0
- hot_reload/watcher.py +179 -0
- hot_reload/websocket.py +176 -0
- scaffolding/README.md +589 -0
- scaffolding/__init__.py +35 -0
- scaffolding/__main__.py +14 -0
- scaffolding/cli.py +240 -0
- test_generator/__init__.py +38 -0
- test_generator/__main__.py +14 -0
- test_generator/cli.py +226 -0
- test_generator/generator.py +325 -0
- test_generator/risk_analyzer.py +216 -0
- workflow_patterns/__init__.py +33 -0
- workflow_patterns/behavior.py +249 -0
- workflow_patterns/core.py +76 -0
- workflow_patterns/output.py +99 -0
- workflow_patterns/registry.py +255 -0
- workflow_patterns/structural.py +288 -0
- workflow_scaffolding/__init__.py +11 -0
- workflow_scaffolding/__main__.py +12 -0
- workflow_scaffolding/cli.py +206 -0
- workflow_scaffolding/generator.py +265 -0
- agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
- agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
- agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
- agents/compliance_anticipation_agent.py +0 -1422
- agents/compliance_db.py +0 -339
- agents/epic_integration_wizard.py +0 -530
- agents/notifications.py +0 -291
- agents/trust_building_behaviors.py +0 -872
- empathy_framework-3.7.0.dist-info/RECORD +0 -105
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/WHEEL +0 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/entry_points.txt +0 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/licenses/LICENSE +0 -0
- /empathy_os/{monitoring.py → agent_monitoring.py} +0 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
"""Code Inspection CLI
|
|
2
|
+
|
|
3
|
+
Command-line interface for the Code Inspection Agent Pipeline.
|
|
4
|
+
|
|
5
|
+
Usage:
|
|
6
|
+
empathy-inspect [path] [options]
|
|
7
|
+
|
|
8
|
+
Examples:
|
|
9
|
+
empathy-inspect . # Inspect current directory
|
|
10
|
+
empathy-inspect ./src --parallel # Parallel mode
|
|
11
|
+
empathy-inspect . --format json # JSON output
|
|
12
|
+
empathy-inspect . --staged # Only staged changes
|
|
13
|
+
empathy-inspect . --fix # Auto-fix safe issues
|
|
14
|
+
|
|
15
|
+
Copyright 2025 Smart AI Memory, LLC
|
|
16
|
+
Licensed under Fair Source 0.9
|
|
17
|
+
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import asyncio
|
|
22
|
+
import sys
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
async def run_auto_fix(project_path: str, verbose: bool = False) -> int:
|
|
27
|
+
"""Run auto-fix using ruff.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
project_path: Path to project to fix
|
|
31
|
+
verbose: Whether to show verbose output
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
Number of issues fixed
|
|
35
|
+
|
|
36
|
+
"""
|
|
37
|
+
import subprocess
|
|
38
|
+
|
|
39
|
+
fixed_count = 0
|
|
40
|
+
|
|
41
|
+
# Run ruff check with --fix
|
|
42
|
+
try:
|
|
43
|
+
print("\nRunning ruff --fix...")
|
|
44
|
+
result = subprocess.run(
|
|
45
|
+
["ruff", "check", project_path, "--fix", "--exit-zero"],
|
|
46
|
+
check=False,
|
|
47
|
+
capture_output=True,
|
|
48
|
+
text=True,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
if verbose and result.stdout:
|
|
52
|
+
print(result.stdout)
|
|
53
|
+
|
|
54
|
+
# Count fixes from output
|
|
55
|
+
if "Fixed" in result.stdout:
|
|
56
|
+
# Parse "Fixed X errors" or similar
|
|
57
|
+
import re
|
|
58
|
+
|
|
59
|
+
match = re.search(r"Fixed (\d+)", result.stdout)
|
|
60
|
+
if match:
|
|
61
|
+
fixed_count += int(match.group(1))
|
|
62
|
+
|
|
63
|
+
except FileNotFoundError:
|
|
64
|
+
print("Warning: ruff not found. Install with: pip install ruff")
|
|
65
|
+
except Exception as e:
|
|
66
|
+
print(f"Warning: ruff fix failed: {e}")
|
|
67
|
+
|
|
68
|
+
# Run ruff format for formatting fixes
|
|
69
|
+
try:
|
|
70
|
+
print("Running ruff format...")
|
|
71
|
+
result = subprocess.run(
|
|
72
|
+
["ruff", "format", project_path],
|
|
73
|
+
check=False,
|
|
74
|
+
capture_output=True,
|
|
75
|
+
text=True,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
if verbose and result.stdout:
|
|
79
|
+
print(result.stdout)
|
|
80
|
+
|
|
81
|
+
# Count formatted files
|
|
82
|
+
if "file" in result.stderr.lower():
|
|
83
|
+
import re
|
|
84
|
+
|
|
85
|
+
match = re.search(r"(\d+) file", result.stderr)
|
|
86
|
+
if match:
|
|
87
|
+
fixed_count += int(match.group(1))
|
|
88
|
+
|
|
89
|
+
except FileNotFoundError:
|
|
90
|
+
pass # Already warned above
|
|
91
|
+
except Exception as e:
|
|
92
|
+
if verbose:
|
|
93
|
+
print(f"Warning: ruff format failed: {e}")
|
|
94
|
+
|
|
95
|
+
# Run isort for import sorting
|
|
96
|
+
try:
|
|
97
|
+
print("Running isort...")
|
|
98
|
+
result = subprocess.run(
|
|
99
|
+
["isort", project_path, "--profile", "black"],
|
|
100
|
+
check=False,
|
|
101
|
+
capture_output=True,
|
|
102
|
+
text=True,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
if verbose and result.stdout:
|
|
106
|
+
print(result.stdout)
|
|
107
|
+
|
|
108
|
+
# isort shows "Fixing" for each file
|
|
109
|
+
if "Fixing" in result.stdout:
|
|
110
|
+
fixed_count += result.stdout.count("Fixing")
|
|
111
|
+
|
|
112
|
+
except FileNotFoundError:
|
|
113
|
+
if verbose:
|
|
114
|
+
print("Note: isort not found. Install with: pip install isort")
|
|
115
|
+
except Exception as e:
|
|
116
|
+
if verbose:
|
|
117
|
+
print(f"Warning: isort failed: {e}")
|
|
118
|
+
|
|
119
|
+
return fixed_count
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def parse_args() -> argparse.Namespace:
|
|
123
|
+
"""Parse command-line arguments."""
|
|
124
|
+
parser = argparse.ArgumentParser(
|
|
125
|
+
prog="empathy-inspect",
|
|
126
|
+
description="Code Inspection Agent Pipeline",
|
|
127
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
128
|
+
epilog="""
|
|
129
|
+
Examples:
|
|
130
|
+
empathy-inspect . Inspect current directory
|
|
131
|
+
empathy-inspect ./src --parallel Run static checks in parallel
|
|
132
|
+
empathy-inspect . --format json Output as JSON
|
|
133
|
+
empathy-inspect . --staged Inspect staged git changes only
|
|
134
|
+
empathy-inspect . --quick Quick mode (skip slow checks)
|
|
135
|
+
""",
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
parser.add_argument(
|
|
139
|
+
"path",
|
|
140
|
+
nargs="?",
|
|
141
|
+
default=".",
|
|
142
|
+
help="Path to inspect (default: current directory)",
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
parser.add_argument(
|
|
146
|
+
"--parallel",
|
|
147
|
+
action="store_true",
|
|
148
|
+
default=True,
|
|
149
|
+
help="Run Phase 1 tools in parallel (default: True)",
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
parser.add_argument(
|
|
153
|
+
"--no-parallel",
|
|
154
|
+
action="store_true",
|
|
155
|
+
help="Disable parallel execution",
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
parser.add_argument(
|
|
159
|
+
"--learning",
|
|
160
|
+
action="store_true",
|
|
161
|
+
default=True,
|
|
162
|
+
help="Enable pattern learning (default: True)",
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
parser.add_argument(
|
|
166
|
+
"--no-learning",
|
|
167
|
+
action="store_true",
|
|
168
|
+
help="Disable pattern learning",
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
parser.add_argument(
|
|
172
|
+
"--format",
|
|
173
|
+
"-f",
|
|
174
|
+
choices=["terminal", "json", "markdown", "sarif", "html"],
|
|
175
|
+
default="terminal",
|
|
176
|
+
help="Output format (default: terminal). Use 'sarif' for GitHub Actions.",
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
parser.add_argument(
|
|
180
|
+
"--staged",
|
|
181
|
+
action="store_true",
|
|
182
|
+
help="Only inspect staged git changes",
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
parser.add_argument(
|
|
186
|
+
"--changed",
|
|
187
|
+
action="store_true",
|
|
188
|
+
help="Only inspect changed files (vs HEAD)",
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
parser.add_argument(
|
|
192
|
+
"--quick",
|
|
193
|
+
"-q",
|
|
194
|
+
action="store_true",
|
|
195
|
+
help="Quick mode (skip slow checks like deep debugging)",
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
parser.add_argument(
|
|
199
|
+
"--fix",
|
|
200
|
+
action="store_true",
|
|
201
|
+
help="Auto-fix safe issues (formatting, imports)",
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
parser.add_argument(
|
|
205
|
+
"--verbose",
|
|
206
|
+
"-v",
|
|
207
|
+
action="store_true",
|
|
208
|
+
help="Verbose output",
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
parser.add_argument(
|
|
212
|
+
"--output",
|
|
213
|
+
"-o",
|
|
214
|
+
type=str,
|
|
215
|
+
help="Write report to file",
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
parser.add_argument(
|
|
219
|
+
"--exclude",
|
|
220
|
+
"-e",
|
|
221
|
+
type=str,
|
|
222
|
+
action="append",
|
|
223
|
+
default=[],
|
|
224
|
+
help="Glob patterns to exclude (can be used multiple times)",
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
# Baseline/suppression options
|
|
228
|
+
parser.add_argument(
|
|
229
|
+
"--no-baseline",
|
|
230
|
+
action="store_true",
|
|
231
|
+
help="Disable baseline filtering (show all findings)",
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
parser.add_argument(
|
|
235
|
+
"--baseline-init",
|
|
236
|
+
action="store_true",
|
|
237
|
+
help="Create an empty .empathy-baseline.json file",
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
parser.add_argument(
|
|
241
|
+
"--baseline-cleanup",
|
|
242
|
+
action="store_true",
|
|
243
|
+
help="Remove expired suppressions from baseline",
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
return parser.parse_args()
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
async def run_inspection(args: argparse.Namespace) -> int:
|
|
250
|
+
"""Run the inspection and return exit code."""
|
|
251
|
+
# Import here to avoid slow startup
|
|
252
|
+
from agents.code_inspection import CodeInspectionAgent
|
|
253
|
+
|
|
254
|
+
# Resolve path
|
|
255
|
+
project_path = str(Path(args.path).resolve())
|
|
256
|
+
|
|
257
|
+
# Determine target mode
|
|
258
|
+
if args.staged:
|
|
259
|
+
target_mode = "staged"
|
|
260
|
+
elif args.changed:
|
|
261
|
+
target_mode = "changed"
|
|
262
|
+
else:
|
|
263
|
+
target_mode = "all"
|
|
264
|
+
|
|
265
|
+
# Create agent
|
|
266
|
+
agent = CodeInspectionAgent(
|
|
267
|
+
parallel_mode=args.parallel and not args.no_parallel,
|
|
268
|
+
learning_enabled=args.learning and not args.no_learning,
|
|
269
|
+
baseline_enabled=not args.no_baseline,
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
# Configure verbose logging
|
|
273
|
+
if args.verbose:
|
|
274
|
+
import logging
|
|
275
|
+
|
|
276
|
+
logging.basicConfig(level=logging.DEBUG)
|
|
277
|
+
|
|
278
|
+
# Run inspection
|
|
279
|
+
state = await agent.inspect(
|
|
280
|
+
project_path=project_path,
|
|
281
|
+
target_mode=target_mode,
|
|
282
|
+
exclude_patterns=args.exclude if args.exclude else None,
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
# Format report
|
|
286
|
+
report = agent.format_report(state, args.format)
|
|
287
|
+
|
|
288
|
+
# Output
|
|
289
|
+
if args.output:
|
|
290
|
+
output_path = Path(args.output)
|
|
291
|
+
output_path.write_text(report)
|
|
292
|
+
print(f"Report written to {output_path}")
|
|
293
|
+
else:
|
|
294
|
+
print(report)
|
|
295
|
+
|
|
296
|
+
# Auto-fix if requested
|
|
297
|
+
if args.fix:
|
|
298
|
+
fixed_count = await run_auto_fix(project_path, args.verbose)
|
|
299
|
+
if fixed_count > 0:
|
|
300
|
+
print(f"\nAuto-fixed {fixed_count} issues. Run inspection again to verify.")
|
|
301
|
+
|
|
302
|
+
# Return exit code based on health status
|
|
303
|
+
if state["health_status"] == "fail":
|
|
304
|
+
return 1
|
|
305
|
+
if state["health_status"] == "warn":
|
|
306
|
+
return 0 # Warn but don't fail
|
|
307
|
+
return 0
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def handle_baseline_commands(args: argparse.Namespace) -> bool:
|
|
311
|
+
"""Handle baseline-specific commands.
|
|
312
|
+
|
|
313
|
+
Returns:
|
|
314
|
+
True if a baseline command was handled (and should exit)
|
|
315
|
+
|
|
316
|
+
"""
|
|
317
|
+
from agents.code_inspection.baseline import BaselineManager, create_baseline_file
|
|
318
|
+
|
|
319
|
+
project_path = str(Path(args.path).resolve())
|
|
320
|
+
|
|
321
|
+
if args.baseline_init:
|
|
322
|
+
baseline_path = create_baseline_file(project_path)
|
|
323
|
+
print(f"Created baseline file: {baseline_path}")
|
|
324
|
+
return True
|
|
325
|
+
|
|
326
|
+
if args.baseline_cleanup:
|
|
327
|
+
manager = BaselineManager(project_path)
|
|
328
|
+
if manager.load():
|
|
329
|
+
removed = manager.cleanup_expired()
|
|
330
|
+
print(f"Removed {removed} expired suppressions")
|
|
331
|
+
else:
|
|
332
|
+
print("No baseline file found")
|
|
333
|
+
return True
|
|
334
|
+
|
|
335
|
+
return False
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def main():
|
|
339
|
+
"""Main entry point for CLI."""
|
|
340
|
+
args = parse_args()
|
|
341
|
+
|
|
342
|
+
try:
|
|
343
|
+
# Handle baseline commands first
|
|
344
|
+
if handle_baseline_commands(args):
|
|
345
|
+
sys.exit(0)
|
|
346
|
+
|
|
347
|
+
exit_code = asyncio.run(run_inspection(args))
|
|
348
|
+
sys.exit(exit_code)
|
|
349
|
+
except KeyboardInterrupt:
|
|
350
|
+
print("\nInspection cancelled.")
|
|
351
|
+
sys.exit(130)
|
|
352
|
+
except Exception as e:
|
|
353
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
354
|
+
if args.verbose:
|
|
355
|
+
import traceback
|
|
356
|
+
|
|
357
|
+
traceback.print_exc()
|
|
358
|
+
sys.exit(1)
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
if __name__ == "__main__":
|
|
362
|
+
main()
|
empathy_software_plugin/cli.py
CHANGED
|
@@ -662,7 +662,9 @@ def scan_command():
|
|
|
662
662
|
severity_icon = (
|
|
663
663
|
"🔴"
|
|
664
664
|
if issue.severity == "high"
|
|
665
|
-
else "🟡"
|
|
665
|
+
else "🟡"
|
|
666
|
+
if issue.severity == "medium"
|
|
667
|
+
else "🔵"
|
|
666
668
|
)
|
|
667
669
|
print(f" {severity_icon} Line {issue.line_number}: {issue.message}")
|
|
668
670
|
if len(result.issues) > 3:
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Software Development Wizards
|
|
2
|
+
|
|
3
|
+
Production-ready wizards for software development with memory enhancement.
|
|
4
|
+
|
|
5
|
+
Memory-Enhanced Wizards (Level 4+):
|
|
6
|
+
- MemoryEnhancedDebuggingWizard: Bug correlation with historical patterns
|
|
7
|
+
- TechDebtWizard: Tech debt trajectory tracking and prediction
|
|
8
|
+
- SecurityLearningWizard: Security scanning with false positive learning
|
|
9
|
+
|
|
10
|
+
Utility Wizards:
|
|
11
|
+
- PatternRetrieverWizard: Pattern search and retrieval (Level 3)
|
|
12
|
+
- PatternExtractionWizard: Auto-detect fixes and suggest patterns (Level 3)
|
|
13
|
+
- CodeReviewWizard: Pattern-based code review (Level 4)
|
|
14
|
+
|
|
15
|
+
Core Wizards:
|
|
16
|
+
- SecurityAnalysisWizard: OWASP vulnerability detection
|
|
17
|
+
- AdvancedDebuggingWizard: Protocol-based debugging
|
|
18
|
+
- PerformanceProfilingWizard: Performance analysis
|
|
19
|
+
- TestingWizard: Test coverage and quality
|
|
20
|
+
- AIDocumentationWizard: Documentation generation
|
|
21
|
+
|
|
22
|
+
Copyright 2025 Smart AI Memory, LLC
|
|
23
|
+
Licensed under Fair Source 0.9
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from .base_wizard import BaseWizard
|
|
27
|
+
from .code_review_wizard import CodeReviewWizard
|
|
28
|
+
from .memory_enhanced_debugging_wizard import MemoryEnhancedDebuggingWizard
|
|
29
|
+
from .pattern_extraction_wizard import PatternExtractionWizard
|
|
30
|
+
from .pattern_retriever_wizard import PatternRetrieverWizard
|
|
31
|
+
from .security_learning_wizard import SecurityLearningWizard
|
|
32
|
+
from .tech_debt_wizard import TechDebtWizard
|
|
33
|
+
|
|
34
|
+
__all__ = [
|
|
35
|
+
"BaseWizard",
|
|
36
|
+
"CodeReviewWizard",
|
|
37
|
+
"MemoryEnhancedDebuggingWizard",
|
|
38
|
+
"PatternExtractionWizard",
|
|
39
|
+
"PatternRetrieverWizard",
|
|
40
|
+
"SecurityLearningWizard",
|
|
41
|
+
"TechDebtWizard",
|
|
42
|
+
]
|