empathy-framework 2.4.0__py3-none-any.whl → 3.8.2__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/__init__.py +13 -12
- coach_wizards/accessibility_wizard.py +12 -12
- coach_wizards/api_wizard.py +12 -12
- coach_wizards/base_wizard.py +26 -20
- coach_wizards/cicd_wizard.py +15 -13
- coach_wizards/code_reviewer_README.md +60 -0
- coach_wizards/code_reviewer_wizard.py +180 -0
- coach_wizards/compliance_wizard.py +12 -12
- coach_wizards/database_wizard.py +12 -12
- coach_wizards/debugging_wizard.py +12 -12
- coach_wizards/documentation_wizard.py +12 -12
- coach_wizards/generate_wizards.py +1 -2
- coach_wizards/localization_wizard.py +101 -19
- coach_wizards/migration_wizard.py +12 -12
- coach_wizards/monitoring_wizard.py +12 -12
- coach_wizards/observability_wizard.py +12 -12
- coach_wizards/performance_wizard.py +12 -12
- coach_wizards/prompt_engineering_wizard.py +661 -0
- coach_wizards/refactoring_wizard.py +12 -12
- coach_wizards/scaling_wizard.py +12 -12
- coach_wizards/security_wizard.py +12 -12
- coach_wizards/testing_wizard.py +12 -12
- empathy_framework-3.8.2.dist-info/METADATA +1176 -0
- empathy_framework-3.8.2.dist-info/RECORD +333 -0
- empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/top_level.txt +5 -1
- empathy_healthcare_plugin/__init__.py +1 -2
- 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/__init__.py +7 -7
- 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/claude_memory.py +14 -15
- empathy_llm_toolkit/cli/__init__.py +8 -0
- empathy_llm_toolkit/cli/sync_claude.py +487 -0
- empathy_llm_toolkit/code_health.py +186 -28
- empathy_llm_toolkit/config/__init__.py +29 -0
- empathy_llm_toolkit/config/unified.py +295 -0
- empathy_llm_toolkit/contextual_patterns.py +11 -12
- empathy_llm_toolkit/core.py +168 -53
- empathy_llm_toolkit/git_pattern_extractor.py +17 -13
- empathy_llm_toolkit/levels.py +6 -13
- empathy_llm_toolkit/pattern_confidence.py +14 -18
- empathy_llm_toolkit/pattern_resolver.py +10 -12
- empathy_llm_toolkit/pattern_summary.py +16 -14
- empathy_llm_toolkit/providers.py +194 -28
- 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/session_status.py +20 -22
- empathy_llm_toolkit/state.py +28 -21
- 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 +125 -84
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/{monitoring.py → agent_monitoring.py} +28 -28
- 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 +1516 -70
- empathy_os/cli_unified.py +597 -0
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/config.py +95 -37
- empathy_os/coordination.py +72 -68
- empathy_os/core.py +94 -107
- empathy_os/cost_tracker.py +74 -55
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/discovery.py +17 -14
- empathy_os/emergence.py +21 -22
- empathy_os/exceptions.py +18 -30
- empathy_os/feedback_loops.py +30 -33
- empathy_os/levels.py +32 -35
- empathy_os/leverage_points.py +31 -32
- empathy_os/logging_config.py +19 -16
- 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/pattern_library.py +30 -29
- empathy_os/persistence.py +35 -37
- empathy_os/platform_utils.py +261 -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/redis_config.py +144 -58
- empathy_os/redis_memory.py +79 -77
- 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/templates.py +19 -14
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/trust_building.py +67 -58
- 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.py → workflow_commands.py} +131 -37
- 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/__init__.py +1 -2
- empathy_software_plugin/cli/__init__.py +120 -0
- empathy_software_plugin/cli/inspect.py +362 -0
- empathy_software_plugin/cli.py +49 -27
- empathy_software_plugin/plugin.py +4 -8
- 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 -1427
- agents/epic_integration_wizard.py +0 -541
- agents/trust_building_behaviors.py +0 -891
- empathy_framework-2.4.0.dist-info/METADATA +0 -485
- empathy_framework-2.4.0.dist-info/RECORD +0 -102
- empathy_framework-2.4.0.dist-info/entry_points.txt +0 -6
- empathy_llm_toolkit/htmlcov/status.json +0 -1
- empathy_llm_toolkit/security/htmlcov/status.json +0 -1
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +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
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Empathy Framework - Software Development CLI
|
|
1
|
+
"""Empathy Framework - Software Development CLI
|
|
3
2
|
|
|
4
3
|
Command-line interface for running AI development wizards on your codebase.
|
|
5
4
|
|
|
@@ -25,10 +24,23 @@ from typing import Any
|
|
|
25
24
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src"))
|
|
26
25
|
|
|
27
26
|
from empathy_os.logging_config import get_logger
|
|
28
|
-
from empathy_os.plugins import get_global_registry
|
|
29
27
|
|
|
30
28
|
logger = get_logger(__name__)
|
|
31
29
|
|
|
30
|
+
|
|
31
|
+
def get_global_registry():
|
|
32
|
+
"""Get the global plugin registry.
|
|
33
|
+
|
|
34
|
+
This wrapper exists so tests can patch this function at the module level
|
|
35
|
+
via `empathy_software_plugin.cli.get_global_registry`.
|
|
36
|
+
|
|
37
|
+
Uses late binding to enable patching in tests.
|
|
38
|
+
"""
|
|
39
|
+
from empathy_os.plugins import get_global_registry as _get_global_registry
|
|
40
|
+
|
|
41
|
+
return _get_global_registry()
|
|
42
|
+
|
|
43
|
+
|
|
32
44
|
# Initialize colorama for cross-platform ANSI color support (especially Windows)
|
|
33
45
|
try:
|
|
34
46
|
import colorama
|
|
@@ -85,14 +97,14 @@ async def analyze_project(
|
|
|
85
97
|
output_format: str = "text",
|
|
86
98
|
verbose: bool = False,
|
|
87
99
|
):
|
|
88
|
-
"""
|
|
89
|
-
Analyze a project with AI development wizards.
|
|
100
|
+
"""Analyze a project with AI development wizards.
|
|
90
101
|
|
|
91
102
|
Args:
|
|
92
103
|
project_path: Path to project root
|
|
93
104
|
wizard_names: List of wizard names to run (or None for all)
|
|
94
105
|
output_format: 'text' or 'json'
|
|
95
106
|
verbose: Show detailed output
|
|
107
|
+
|
|
96
108
|
"""
|
|
97
109
|
logger.info(f"Starting project analysis for: {project_path} (format: {output_format})")
|
|
98
110
|
print_header("Empathy Framework - AI Development Analysis")
|
|
@@ -179,8 +191,7 @@ async def analyze_project(
|
|
|
179
191
|
|
|
180
192
|
|
|
181
193
|
async def gather_project_context(project_path: str) -> dict[str, Any]:
|
|
182
|
-
"""
|
|
183
|
-
Gather context about the project.
|
|
194
|
+
"""Gather context about the project.
|
|
184
195
|
|
|
185
196
|
Returns dictionary with all context needed by wizards.
|
|
186
197
|
"""
|
|
@@ -221,8 +232,10 @@ async def gather_project_context(project_path: str) -> dict[str, Any]:
|
|
|
221
232
|
|
|
222
233
|
# Parse AI calls
|
|
223
234
|
context["ai_calls"].extend(parse_ai_calls(str(file_path), content))
|
|
224
|
-
except Exception:
|
|
225
|
-
|
|
235
|
+
except Exception as e:
|
|
236
|
+
# Best effort: Skip files that can't be parsed (corrupted, binary, etc.)
|
|
237
|
+
logger.debug(f"Could not parse {file_path}: {e}")
|
|
238
|
+
pass
|
|
226
239
|
|
|
227
240
|
# All Python/JS/TS files are code files
|
|
228
241
|
context["code_files"].append(str(file_path))
|
|
@@ -251,6 +264,7 @@ async def gather_project_context(project_path: str) -> dict[str, Any]:
|
|
|
251
264
|
|
|
252
265
|
result = subprocess.run(
|
|
253
266
|
["git", "log", "--oneline", "--name-only", "-50"],
|
|
267
|
+
check=False,
|
|
254
268
|
cwd=project_path,
|
|
255
269
|
capture_output=True,
|
|
256
270
|
text=True,
|
|
@@ -258,8 +272,10 @@ async def gather_project_context(project_path: str) -> dict[str, Any]:
|
|
|
258
272
|
)
|
|
259
273
|
if result.returncode == 0:
|
|
260
274
|
context["version_history"] = parse_git_history(result.stdout)
|
|
261
|
-
except Exception:
|
|
262
|
-
|
|
275
|
+
except Exception as e:
|
|
276
|
+
# Optional: Git history unavailable (not a git repo or git not installed)
|
|
277
|
+
logger.debug(f"Could not fetch git history: {e}")
|
|
278
|
+
pass
|
|
263
279
|
|
|
264
280
|
return context
|
|
265
281
|
|
|
@@ -278,7 +294,7 @@ def parse_ai_calls(file_path: str, content: str) -> list[dict[str, Any]]:
|
|
|
278
294
|
"code_snippet": content[:500], # First 500 chars as sample
|
|
279
295
|
"prompt_size": len(content),
|
|
280
296
|
"conversation_id": None, # Could detect from context
|
|
281
|
-
}
|
|
297
|
+
},
|
|
282
298
|
)
|
|
283
299
|
|
|
284
300
|
return calls
|
|
@@ -307,7 +323,6 @@ def parse_git_history(git_output: str) -> list[dict[str, Any]]:
|
|
|
307
323
|
|
|
308
324
|
def prepare_wizard_context(wizard_name: str, full_context: dict[str, Any]) -> dict[str, Any]:
|
|
309
325
|
"""Prepare context specific to a wizard's requirements"""
|
|
310
|
-
|
|
311
326
|
base_context = {
|
|
312
327
|
"project_path": full_context["project_path"],
|
|
313
328
|
"version_history": full_context.get("version_history", []),
|
|
@@ -319,7 +334,7 @@ def prepare_wizard_context(wizard_name: str, full_context: dict[str, Any]) -> di
|
|
|
319
334
|
"prompt_files": full_context.get("prompt_files", []),
|
|
320
335
|
}
|
|
321
336
|
|
|
322
|
-
|
|
337
|
+
if wizard_name == "context_window":
|
|
323
338
|
return {
|
|
324
339
|
**base_context,
|
|
325
340
|
"ai_calls": full_context.get("ai_calls", []),
|
|
@@ -328,14 +343,14 @@ def prepare_wizard_context(wizard_name: str, full_context: dict[str, Any]) -> di
|
|
|
328
343
|
"model_name": "claude-3-sonnet",
|
|
329
344
|
}
|
|
330
345
|
|
|
331
|
-
|
|
346
|
+
if wizard_name == "collaboration_pattern":
|
|
332
347
|
return {
|
|
333
348
|
**base_context,
|
|
334
349
|
"ai_integration_files": full_context.get("ai_integration_files", []),
|
|
335
350
|
"ai_usage_patterns": full_context.get("ai_usage_patterns", []),
|
|
336
351
|
}
|
|
337
352
|
|
|
338
|
-
|
|
353
|
+
if wizard_name == "ai_documentation":
|
|
339
354
|
return {
|
|
340
355
|
**base_context,
|
|
341
356
|
"documentation_files": full_context.get("documentation_files", []),
|
|
@@ -347,7 +362,6 @@ def prepare_wizard_context(wizard_name: str, full_context: dict[str, Any]) -> di
|
|
|
347
362
|
|
|
348
363
|
def display_wizard_results(wizard, result: dict[str, Any], verbose: bool):
|
|
349
364
|
"""Display wizard results in human-readable format"""
|
|
350
|
-
|
|
351
365
|
# Issues
|
|
352
366
|
issues = result.get("issues", [])
|
|
353
367
|
if issues:
|
|
@@ -448,7 +462,7 @@ def list_wizards():
|
|
|
448
462
|
print(f"\n{Colors.BOLD}{wizard_id}{Colors.END}")
|
|
449
463
|
print(f" Name: {info['name']}")
|
|
450
464
|
print(
|
|
451
|
-
f" Level: {info['empathy_level']} ({'Anticipatory' if info['empathy_level'] == 4 else 'Other'})"
|
|
465
|
+
f" Level: {info['empathy_level']} ({'Anticipatory' if info['empathy_level'] == 4 else 'Other'})",
|
|
452
466
|
)
|
|
453
467
|
print(f" Category: {info.get('category', 'N/A')}")
|
|
454
468
|
|
|
@@ -507,10 +521,15 @@ Examples:
|
|
|
507
521
|
analyze_parser = subparsers.add_parser("analyze", help="Analyze a project")
|
|
508
522
|
analyze_parser.add_argument("path", help="Path to project")
|
|
509
523
|
analyze_parser.add_argument(
|
|
510
|
-
"--wizards",
|
|
524
|
+
"--wizards",
|
|
525
|
+
help="Comma-separated list of wizards to run",
|
|
526
|
+
default=None,
|
|
511
527
|
)
|
|
512
528
|
analyze_parser.add_argument(
|
|
513
|
-
"--output",
|
|
529
|
+
"--output",
|
|
530
|
+
choices=["text", "json"],
|
|
531
|
+
default="text",
|
|
532
|
+
help="Output format",
|
|
514
533
|
)
|
|
515
534
|
analyze_parser.add_argument("--verbose", action="store_true", help="Show detailed output")
|
|
516
535
|
|
|
@@ -539,21 +558,20 @@ Examples:
|
|
|
539
558
|
wizard_names=wizard_names,
|
|
540
559
|
output_format=args.output,
|
|
541
560
|
verbose=args.verbose,
|
|
542
|
-
)
|
|
561
|
+
),
|
|
543
562
|
)
|
|
544
563
|
|
|
545
|
-
|
|
564
|
+
if args.command == "list-wizards":
|
|
546
565
|
return list_wizards()
|
|
547
566
|
|
|
548
|
-
|
|
567
|
+
if args.command == "wizard-info":
|
|
549
568
|
return wizard_info(args.wizard_id)
|
|
550
569
|
|
|
551
570
|
return 0
|
|
552
571
|
|
|
553
572
|
|
|
554
573
|
def scan_command():
|
|
555
|
-
"""
|
|
556
|
-
Entry point for empathy-scan command (converted from bin/empathy-scan).
|
|
574
|
+
"""Entry point for empathy-scan command (converted from bin/empathy-scan).
|
|
557
575
|
One-click security & performance scanner.
|
|
558
576
|
"""
|
|
559
577
|
logger.info("Empathy Framework security and performance scanner started")
|
|
@@ -633,7 +651,9 @@ def scan_command():
|
|
|
633
651
|
|
|
634
652
|
for wizard_name, wizard in wizards:
|
|
635
653
|
result = wizard.run_full_analysis(
|
|
636
|
-
code=code,
|
|
654
|
+
code=code,
|
|
655
|
+
file_path=str(file_path),
|
|
656
|
+
language="python",
|
|
637
657
|
)
|
|
638
658
|
|
|
639
659
|
if result.issues:
|
|
@@ -642,7 +662,9 @@ def scan_command():
|
|
|
642
662
|
severity_icon = (
|
|
643
663
|
"🔴"
|
|
644
664
|
if issue.severity == "high"
|
|
645
|
-
else "🟡"
|
|
665
|
+
else "🟡"
|
|
666
|
+
if issue.severity == "medium"
|
|
667
|
+
else "🔵"
|
|
646
668
|
)
|
|
647
669
|
print(f" {severity_icon} Line {issue.line_number}: {issue.message}")
|
|
648
670
|
if len(result.issues) > 3:
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Software Development Plugin for Empathy Framework
|
|
1
|
+
"""Software Development Plugin for Empathy Framework
|
|
3
2
|
|
|
4
3
|
This plugin provides 16+ Coach wizards for code analysis,
|
|
5
4
|
demonstrating Level 4 Anticipatory Empathy in software development.
|
|
@@ -25,8 +24,7 @@ logger = logging.getLogger(__name__)
|
|
|
25
24
|
|
|
26
25
|
|
|
27
26
|
class SoftwarePlugin(BasePlugin):
|
|
28
|
-
"""
|
|
29
|
-
Software Development Domain Plugin
|
|
27
|
+
"""Software Development Domain Plugin
|
|
30
28
|
|
|
31
29
|
Provides wizards for:
|
|
32
30
|
- Security analysis
|
|
@@ -59,8 +57,7 @@ class SoftwarePlugin(BasePlugin):
|
|
|
59
57
|
)
|
|
60
58
|
|
|
61
59
|
def register_wizards(self) -> dict[str, type[BaseWizard]]:
|
|
62
|
-
"""
|
|
63
|
-
Register all software development wizards.
|
|
60
|
+
"""Register all software development wizards.
|
|
64
61
|
|
|
65
62
|
In our experience building these wizards, we found that the framework
|
|
66
63
|
enables a fundamental shift: instead of reactive debugging, the system
|
|
@@ -157,8 +154,7 @@ class SoftwarePlugin(BasePlugin):
|
|
|
157
154
|
return wizards
|
|
158
155
|
|
|
159
156
|
def register_patterns(self) -> dict:
|
|
160
|
-
"""
|
|
161
|
-
Register software development patterns.
|
|
157
|
+
"""Register software development patterns.
|
|
162
158
|
|
|
163
159
|
These patterns were learned from real-world usage and enable
|
|
164
160
|
cross-domain learning (Level 5 Systems Empathy).
|
|
@@ -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
|
+
]
|