empathy-framework 3.2.3__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 +11 -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 +22 -25
- 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.2.3.dist-info → empathy_framework-3.8.2.dist-info}/METADATA +513 -58
- empathy_framework-3.8.2.dist-info/RECORD +333 -0
- empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
- {empathy_framework-3.2.3.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 +177 -22
- 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 +51 -49
- empathy_llm_toolkit/git_pattern_extractor.py +16 -12
- 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 +13 -11
- 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 +18 -20
- empathy_llm_toolkit/state.py +20 -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 +76 -77
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/{monitoring.py → agent_monitoring.py} +27 -27
- 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 +515 -109
- empathy_os/cli_unified.py +189 -42
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/config.py +87 -36
- empathy_os/coordination.py +48 -54
- empathy_os/core.py +90 -99
- empathy_os/cost_tracker.py +20 -23
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/discovery.py +9 -11
- empathy_os/emergence.py +20 -21
- empathy_os/exceptions.py +18 -30
- empathy_os/feedback_loops.py +27 -30
- empathy_os/levels.py +31 -34
- empathy_os/leverage_points.py +27 -28
- empathy_os/logging_config.py +11 -12
- 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 +29 -28
- empathy_os/persistence.py +30 -34
- 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 +53 -56
- 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 +12 -11
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/trust_building.py +44 -36
- 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} +123 -31
- 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 +35 -26
- 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-3.2.3.dist-info/RECORD +0 -104
- empathy_framework-3.2.3.dist-info/entry_points.txt +0 -7
- empathy_llm_toolkit/htmlcov/status.json +0 -1
- empathy_llm_toolkit/security/htmlcov/status.json +0 -1
- {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
- {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
"""Crew Integration for Project Index
|
|
2
|
+
|
|
3
|
+
Enables CrewAI crews and agents to maintain the project index.
|
|
4
|
+
|
|
5
|
+
Key features:
|
|
6
|
+
- Index Maintainer Crew: Automatic index updates
|
|
7
|
+
- Agent tools for querying and updating index
|
|
8
|
+
- Scheduled maintenance tasks
|
|
9
|
+
- Integration with existing workflows
|
|
10
|
+
|
|
11
|
+
Copyright 2025 Smart AI Memory, LLC
|
|
12
|
+
Licensed under Fair Source 0.9
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from collections.abc import Callable
|
|
16
|
+
from datetime import datetime
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
from .index import ProjectIndex
|
|
20
|
+
from .models import FileRecord
|
|
21
|
+
from .reports import ReportGenerator
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ProjectIndexTools:
|
|
25
|
+
"""Tools for agents to interact with the project index.
|
|
26
|
+
|
|
27
|
+
These can be registered with CrewAI or LangChain agents.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(self, index: ProjectIndex):
|
|
31
|
+
self.index = index
|
|
32
|
+
|
|
33
|
+
def get_tools(self) -> list[dict[str, Any]]:
|
|
34
|
+
"""Get tool definitions for agent registration."""
|
|
35
|
+
return [
|
|
36
|
+
{
|
|
37
|
+
"name": "query_project_index",
|
|
38
|
+
"description": "Query the project index for file information. Returns files matching criteria.",
|
|
39
|
+
"func": self.query_index,
|
|
40
|
+
"parameters": {
|
|
41
|
+
"query_type": "string (one of: needing_tests, stale, high_impact, by_path)",
|
|
42
|
+
"filter_value": "string (optional path pattern or category)",
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "get_file_info",
|
|
47
|
+
"description": "Get detailed information about a specific file.",
|
|
48
|
+
"func": self.get_file_info,
|
|
49
|
+
"parameters": {
|
|
50
|
+
"file_path": "string (relative path to file)",
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"name": "update_file_metadata",
|
|
55
|
+
"description": "Update metadata for a file in the index.",
|
|
56
|
+
"func": self.update_file_metadata,
|
|
57
|
+
"parameters": {
|
|
58
|
+
"file_path": "string (relative path to file)",
|
|
59
|
+
"updates": "dict (key-value pairs to update)",
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "get_project_summary",
|
|
64
|
+
"description": "Get overall project health summary.",
|
|
65
|
+
"func": self.get_project_summary,
|
|
66
|
+
"parameters": {},
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "generate_report",
|
|
70
|
+
"description": "Generate a specific report (health, test_gap, staleness, sprint_planning).",
|
|
71
|
+
"func": self.generate_report,
|
|
72
|
+
"parameters": {
|
|
73
|
+
"report_type": "string (one of: health, test_gap, staleness, sprint_planning)",
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "refresh_index",
|
|
78
|
+
"description": "Refresh the entire project index by re-scanning files.",
|
|
79
|
+
"func": self.refresh_index,
|
|
80
|
+
"parameters": {},
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"name": "mark_tests_updated",
|
|
84
|
+
"description": "Mark that tests have been updated for a file.",
|
|
85
|
+
"func": self.mark_tests_updated,
|
|
86
|
+
"parameters": {
|
|
87
|
+
"file_path": "string (relative path to source file)",
|
|
88
|
+
"test_file_path": "string (relative path to test file)",
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
def query_index(self, query_type: str, filter_value: str = "") -> list[dict[str, Any]]:
|
|
94
|
+
"""Query the index for files."""
|
|
95
|
+
if query_type == "needing_tests":
|
|
96
|
+
files = self.index.get_files_needing_tests()
|
|
97
|
+
elif query_type == "stale":
|
|
98
|
+
files = self.index.get_stale_files()
|
|
99
|
+
elif query_type == "high_impact":
|
|
100
|
+
files = self.index.get_high_impact_files()
|
|
101
|
+
elif query_type == "by_path" and filter_value:
|
|
102
|
+
files = self.index.search_files(filter_value)
|
|
103
|
+
elif query_type == "attention":
|
|
104
|
+
files = self.index.get_files_needing_attention()
|
|
105
|
+
else:
|
|
106
|
+
files = []
|
|
107
|
+
|
|
108
|
+
return [f.to_dict() for f in files[:20]]
|
|
109
|
+
|
|
110
|
+
def get_file_info(self, file_path: str) -> dict[str, Any] | None:
|
|
111
|
+
"""Get info for a specific file."""
|
|
112
|
+
record = self.index.get_file(file_path)
|
|
113
|
+
return record.to_dict() if record else None
|
|
114
|
+
|
|
115
|
+
def update_file_metadata(self, file_path: str, updates: dict[str, Any]) -> bool:
|
|
116
|
+
"""Update file metadata."""
|
|
117
|
+
return self.index.update_file(file_path, **updates)
|
|
118
|
+
|
|
119
|
+
def get_project_summary(self) -> dict[str, Any]:
|
|
120
|
+
"""Get project summary."""
|
|
121
|
+
return self.index.get_summary().to_dict()
|
|
122
|
+
|
|
123
|
+
def generate_report(self, report_type: str) -> dict[str, Any]:
|
|
124
|
+
"""Generate a report."""
|
|
125
|
+
generator = ReportGenerator(
|
|
126
|
+
self.index.get_summary(),
|
|
127
|
+
self.index.get_all_files(),
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
if report_type == "health":
|
|
131
|
+
return generator.health_report()
|
|
132
|
+
if report_type == "test_gap":
|
|
133
|
+
return generator.test_gap_report()
|
|
134
|
+
if report_type == "staleness":
|
|
135
|
+
return generator.staleness_report()
|
|
136
|
+
if report_type == "sprint_planning":
|
|
137
|
+
return generator.sprint_planning_report()
|
|
138
|
+
if report_type == "coverage":
|
|
139
|
+
return generator.coverage_report()
|
|
140
|
+
return generator.health_report()
|
|
141
|
+
|
|
142
|
+
def refresh_index(self) -> dict[str, Any]:
|
|
143
|
+
"""Refresh the index."""
|
|
144
|
+
self.index.refresh()
|
|
145
|
+
return {
|
|
146
|
+
"status": "refreshed",
|
|
147
|
+
"file_count": len(self.index.get_all_files()),
|
|
148
|
+
"timestamp": datetime.now().isoformat(),
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
def mark_tests_updated(self, file_path: str, test_file_path: str) -> bool:
|
|
152
|
+
"""Mark tests as updated for a file."""
|
|
153
|
+
return self.index.update_file(
|
|
154
|
+
file_path,
|
|
155
|
+
tests_exist=True,
|
|
156
|
+
test_file_path=test_file_path,
|
|
157
|
+
tests_last_modified=datetime.now(),
|
|
158
|
+
is_stale=False,
|
|
159
|
+
staleness_days=0,
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class IndexMaintenanceTasks:
|
|
164
|
+
"""Maintenance tasks that can be run by agents or scheduled.
|
|
165
|
+
|
|
166
|
+
These tasks keep the index accurate and up-to-date.
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
def __init__(self, index: ProjectIndex):
|
|
170
|
+
self.index = index
|
|
171
|
+
|
|
172
|
+
def daily_refresh(self) -> dict[str, Any]:
|
|
173
|
+
"""Daily index refresh.
|
|
174
|
+
|
|
175
|
+
- Re-scans all files
|
|
176
|
+
- Updates staleness calculations
|
|
177
|
+
- Generates summary
|
|
178
|
+
"""
|
|
179
|
+
self.index.refresh()
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
"task": "daily_refresh",
|
|
183
|
+
"completed_at": datetime.now().isoformat(),
|
|
184
|
+
"files_indexed": len(self.index.get_all_files()),
|
|
185
|
+
"files_needing_attention": self.index.get_summary().files_needing_attention,
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
def coverage_sync(self, coverage_xml_path: str) -> dict[str, Any]:
|
|
189
|
+
"""Sync coverage data from coverage.xml.
|
|
190
|
+
|
|
191
|
+
Should be run after test runs.
|
|
192
|
+
"""
|
|
193
|
+
import defusedxml.ElementTree as ET
|
|
194
|
+
|
|
195
|
+
try:
|
|
196
|
+
tree = ET.parse(coverage_xml_path)
|
|
197
|
+
root = tree.getroot()
|
|
198
|
+
|
|
199
|
+
coverage_data: dict[str, float] = {}
|
|
200
|
+
|
|
201
|
+
for package in root.findall(".//package"):
|
|
202
|
+
for cls in package.findall("classes/class"):
|
|
203
|
+
filename = cls.get("filename", "")
|
|
204
|
+
line_rate = float(cls.get("line-rate", 0))
|
|
205
|
+
coverage_data[filename] = line_rate * 100
|
|
206
|
+
|
|
207
|
+
updated = self.index.update_coverage(coverage_data)
|
|
208
|
+
|
|
209
|
+
return {
|
|
210
|
+
"task": "coverage_sync",
|
|
211
|
+
"completed_at": datetime.now().isoformat(),
|
|
212
|
+
"files_updated": updated,
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
except Exception as e:
|
|
216
|
+
return {
|
|
217
|
+
"task": "coverage_sync",
|
|
218
|
+
"error": str(e),
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
def identify_test_opportunities(self) -> dict[str, Any]:
|
|
222
|
+
"""Identify files that are good candidates for test generation.
|
|
223
|
+
|
|
224
|
+
Prioritizes by impact and ease of testing.
|
|
225
|
+
"""
|
|
226
|
+
needing_tests = self.index.get_files_needing_tests()
|
|
227
|
+
|
|
228
|
+
opportunities = []
|
|
229
|
+
for record in needing_tests[:20]:
|
|
230
|
+
opportunity = {
|
|
231
|
+
"path": record.path,
|
|
232
|
+
"priority": "high" if record.impact_score >= 5.0 else "medium",
|
|
233
|
+
"estimated_effort": self._estimate_test_effort(record),
|
|
234
|
+
"reason": self._test_reason(record),
|
|
235
|
+
}
|
|
236
|
+
opportunities.append(opportunity)
|
|
237
|
+
|
|
238
|
+
return {
|
|
239
|
+
"task": "identify_test_opportunities",
|
|
240
|
+
"completed_at": datetime.now().isoformat(),
|
|
241
|
+
"opportunities": opportunities,
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
def _estimate_test_effort(self, record: FileRecord) -> str:
|
|
245
|
+
"""Estimate effort to write tests."""
|
|
246
|
+
if record.lines_of_code < 50:
|
|
247
|
+
return "small"
|
|
248
|
+
if record.lines_of_code < 200:
|
|
249
|
+
return "medium"
|
|
250
|
+
return "large"
|
|
251
|
+
|
|
252
|
+
def _test_reason(self, record: FileRecord) -> str:
|
|
253
|
+
"""Generate reason for testing."""
|
|
254
|
+
reasons = []
|
|
255
|
+
if record.impact_score >= 5.0:
|
|
256
|
+
reasons.append(f"high impact ({record.impact_score:.1f})")
|
|
257
|
+
if record.imported_by_count > 3:
|
|
258
|
+
reasons.append(f"used by {record.imported_by_count} files")
|
|
259
|
+
if not reasons:
|
|
260
|
+
reasons.append("untested source file")
|
|
261
|
+
return ", ".join(reasons)
|
|
262
|
+
|
|
263
|
+
def stale_test_alert(self) -> dict[str, Any]:
|
|
264
|
+
"""Check for stale tests and generate alerts."""
|
|
265
|
+
stale = self.index.get_stale_files()
|
|
266
|
+
|
|
267
|
+
alerts = []
|
|
268
|
+
for record in stale:
|
|
269
|
+
if record.staleness_days > 30:
|
|
270
|
+
severity = "high"
|
|
271
|
+
elif record.staleness_days > 14:
|
|
272
|
+
severity = "medium"
|
|
273
|
+
else:
|
|
274
|
+
severity = "low"
|
|
275
|
+
|
|
276
|
+
alerts.append(
|
|
277
|
+
{
|
|
278
|
+
"path": record.path,
|
|
279
|
+
"staleness_days": record.staleness_days,
|
|
280
|
+
"severity": severity,
|
|
281
|
+
"test_file": record.test_file_path,
|
|
282
|
+
},
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
return {
|
|
286
|
+
"task": "stale_test_alert",
|
|
287
|
+
"completed_at": datetime.now().isoformat(),
|
|
288
|
+
"alert_count": len(alerts),
|
|
289
|
+
"alerts": alerts,
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def create_index_maintainer_crew_config() -> dict[str, Any]:
|
|
294
|
+
"""Generate CrewAI crew configuration for index maintenance.
|
|
295
|
+
|
|
296
|
+
This crew can be instantiated to automatically maintain the index.
|
|
297
|
+
"""
|
|
298
|
+
return {
|
|
299
|
+
"name": "Project Index Maintainer Crew",
|
|
300
|
+
"description": "Maintains the project index for code intelligence",
|
|
301
|
+
"agents": [
|
|
302
|
+
{
|
|
303
|
+
"name": "Index Scanner Agent",
|
|
304
|
+
"role": "File Discovery and Analysis",
|
|
305
|
+
"goal": "Keep the project index accurate and up-to-date",
|
|
306
|
+
"backstory": (
|
|
307
|
+
"You are responsible for scanning the codebase and maintaining "
|
|
308
|
+
"accurate metadata about every file. You track which files need "
|
|
309
|
+
"tests, which tests are stale, and overall project health."
|
|
310
|
+
),
|
|
311
|
+
"tools": ["refresh_index", "query_project_index", "get_file_info"],
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
"name": "Test Gap Analyst Agent",
|
|
315
|
+
"role": "Test Coverage Analysis",
|
|
316
|
+
"goal": "Identify and prioritize files needing tests",
|
|
317
|
+
"backstory": (
|
|
318
|
+
"You analyze test coverage and identify the most critical "
|
|
319
|
+
"gaps. You prioritize files by impact score and recommend "
|
|
320
|
+
"which files to test first for maximum value."
|
|
321
|
+
),
|
|
322
|
+
"tools": ["query_project_index", "generate_report", "get_project_summary"],
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
"name": "Report Generator Agent",
|
|
326
|
+
"role": "Project Health Reporting",
|
|
327
|
+
"goal": "Generate actionable reports for project management",
|
|
328
|
+
"backstory": (
|
|
329
|
+
"You create comprehensive reports about project health, "
|
|
330
|
+
"test coverage, and areas needing attention. Your reports "
|
|
331
|
+
"help teams prioritize work and track progress."
|
|
332
|
+
),
|
|
333
|
+
"tools": ["generate_report", "get_project_summary"],
|
|
334
|
+
},
|
|
335
|
+
],
|
|
336
|
+
"tasks": [
|
|
337
|
+
{
|
|
338
|
+
"name": "daily_index_refresh",
|
|
339
|
+
"description": "Refresh the project index daily",
|
|
340
|
+
"agent": "Index Scanner Agent",
|
|
341
|
+
"schedule": "daily",
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
"name": "weekly_test_gap_analysis",
|
|
345
|
+
"description": "Analyze test gaps and prioritize opportunities",
|
|
346
|
+
"agent": "Test Gap Analyst Agent",
|
|
347
|
+
"schedule": "weekly",
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"name": "weekly_health_report",
|
|
351
|
+
"description": "Generate weekly project health report",
|
|
352
|
+
"agent": "Report Generator Agent",
|
|
353
|
+
"schedule": "weekly",
|
|
354
|
+
},
|
|
355
|
+
],
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def integrate_with_workflow(index: ProjectIndex, workflow_name: str) -> dict[str, Any]:
|
|
360
|
+
"""Get index context for a specific workflow.
|
|
361
|
+
|
|
362
|
+
Workflows can call this to get relevant index data.
|
|
363
|
+
"""
|
|
364
|
+
return index.get_context_for_workflow(workflow_name)
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
class IndexEventHooks:
|
|
368
|
+
"""Event hooks for automatic index updates.
|
|
369
|
+
|
|
370
|
+
Can be triggered by CI/CD, git hooks, or file watchers.
|
|
371
|
+
"""
|
|
372
|
+
|
|
373
|
+
def __init__(self, index: ProjectIndex):
|
|
374
|
+
self.index = index
|
|
375
|
+
self.callbacks: dict[str, list[Callable]] = {
|
|
376
|
+
"on_file_changed": [],
|
|
377
|
+
"on_test_run_complete": [],
|
|
378
|
+
"on_commit": [],
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
def register_callback(self, event: str, callback: Callable) -> None:
|
|
382
|
+
"""Register a callback for an event."""
|
|
383
|
+
if event in self.callbacks:
|
|
384
|
+
self.callbacks[event].append(callback)
|
|
385
|
+
|
|
386
|
+
def on_file_changed(self, file_path: str) -> None:
|
|
387
|
+
"""Called when a file is modified.
|
|
388
|
+
|
|
389
|
+
Can be triggered by file watcher or git hook.
|
|
390
|
+
"""
|
|
391
|
+
# Update the specific file record
|
|
392
|
+
record = self.index.get_file(file_path)
|
|
393
|
+
if record:
|
|
394
|
+
self.index.update_file(file_path, last_modified=datetime.now())
|
|
395
|
+
|
|
396
|
+
# Check if this file has tests that might now be stale
|
|
397
|
+
if record.test_file_path:
|
|
398
|
+
self.index.update_file(
|
|
399
|
+
file_path,
|
|
400
|
+
is_stale=True,
|
|
401
|
+
)
|
|
402
|
+
|
|
403
|
+
# Trigger callbacks
|
|
404
|
+
for callback in self.callbacks["on_file_changed"]:
|
|
405
|
+
callback(file_path)
|
|
406
|
+
|
|
407
|
+
def on_test_run_complete(self, coverage_xml_path: str | None = None) -> None:
|
|
408
|
+
"""Called after a test run completes.
|
|
409
|
+
|
|
410
|
+
Updates coverage data if provided.
|
|
411
|
+
"""
|
|
412
|
+
if coverage_xml_path:
|
|
413
|
+
tasks = IndexMaintenanceTasks(self.index)
|
|
414
|
+
tasks.coverage_sync(coverage_xml_path)
|
|
415
|
+
|
|
416
|
+
# Trigger callbacks
|
|
417
|
+
for callback in self.callbacks["on_test_run_complete"]:
|
|
418
|
+
callback(coverage_xml_path)
|
|
419
|
+
|
|
420
|
+
def on_commit(self, changed_files: list[str]) -> None:
|
|
421
|
+
"""Called after a git commit.
|
|
422
|
+
|
|
423
|
+
Updates index for changed files.
|
|
424
|
+
"""
|
|
425
|
+
for file_path in changed_files:
|
|
426
|
+
self.on_file_changed(file_path)
|
|
427
|
+
|
|
428
|
+
# Trigger callbacks
|
|
429
|
+
for callback in self.callbacks["on_commit"]:
|
|
430
|
+
callback(changed_files)
|