empathy-framework 3.7.0__py3-none-any.whl → 3.7.1__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.
Files changed (267) hide show
  1. coach_wizards/code_reviewer_README.md +60 -0
  2. coach_wizards/code_reviewer_wizard.py +180 -0
  3. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/METADATA +20 -2
  4. empathy_framework-3.7.1.dist-info/RECORD +327 -0
  5. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/top_level.txt +5 -1
  6. empathy_healthcare_plugin/monitors/__init__.py +9 -0
  7. empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
  8. empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
  9. empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
  10. empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
  11. empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
  12. empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
  13. empathy_llm_toolkit/agent_factory/__init__.py +53 -0
  14. empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
  15. empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
  16. empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
  17. empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
  18. empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
  19. empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
  20. empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
  21. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
  22. empathy_llm_toolkit/agent_factory/base.py +305 -0
  23. empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
  24. empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
  25. empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
  26. empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
  27. empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
  28. empathy_llm_toolkit/agent_factory/decorators.py +286 -0
  29. empathy_llm_toolkit/agent_factory/factory.py +558 -0
  30. empathy_llm_toolkit/agent_factory/framework.py +192 -0
  31. empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
  32. empathy_llm_toolkit/agent_factory/resilient.py +320 -0
  33. empathy_llm_toolkit/cli/__init__.py +8 -0
  34. empathy_llm_toolkit/cli/sync_claude.py +487 -0
  35. empathy_llm_toolkit/code_health.py +150 -3
  36. empathy_llm_toolkit/config/__init__.py +29 -0
  37. empathy_llm_toolkit/config/unified.py +295 -0
  38. empathy_llm_toolkit/routing/__init__.py +32 -0
  39. empathy_llm_toolkit/routing/model_router.py +362 -0
  40. empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
  41. empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
  42. empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  43. empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
  44. empathy_llm_toolkit/security/README.md +262 -0
  45. empathy_llm_toolkit/security/__init__.py +62 -0
  46. empathy_llm_toolkit/security/audit_logger.py +929 -0
  47. empathy_llm_toolkit/security/audit_logger_example.py +152 -0
  48. empathy_llm_toolkit/security/pii_scrubber.py +640 -0
  49. empathy_llm_toolkit/security/secrets_detector.py +678 -0
  50. empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
  51. empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
  52. empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
  53. empathy_llm_toolkit/wizards/__init__.py +38 -0
  54. empathy_llm_toolkit/wizards/base_wizard.py +364 -0
  55. empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
  56. empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
  57. empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
  58. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
  59. empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
  60. empathy_os/__init__.py +52 -52
  61. empathy_os/adaptive/__init__.py +13 -0
  62. empathy_os/adaptive/task_complexity.py +127 -0
  63. empathy_os/cli.py +118 -8
  64. empathy_os/cli_unified.py +121 -1
  65. empathy_os/config/__init__.py +63 -0
  66. empathy_os/config/xml_config.py +239 -0
  67. empathy_os/dashboard/__init__.py +15 -0
  68. empathy_os/dashboard/server.py +743 -0
  69. empathy_os/memory/__init__.py +195 -0
  70. empathy_os/memory/claude_memory.py +466 -0
  71. empathy_os/memory/config.py +224 -0
  72. empathy_os/memory/control_panel.py +1298 -0
  73. empathy_os/memory/edges.py +179 -0
  74. empathy_os/memory/graph.py +567 -0
  75. empathy_os/memory/long_term.py +1193 -0
  76. empathy_os/memory/nodes.py +179 -0
  77. empathy_os/memory/redis_bootstrap.py +540 -0
  78. empathy_os/memory/security/__init__.py +31 -0
  79. empathy_os/memory/security/audit_logger.py +930 -0
  80. empathy_os/memory/security/pii_scrubber.py +640 -0
  81. empathy_os/memory/security/secrets_detector.py +678 -0
  82. empathy_os/memory/short_term.py +2119 -0
  83. empathy_os/memory/storage/__init__.py +15 -0
  84. empathy_os/memory/summary_index.py +583 -0
  85. empathy_os/memory/unified.py +619 -0
  86. empathy_os/metrics/__init__.py +12 -0
  87. empathy_os/metrics/prompt_metrics.py +190 -0
  88. empathy_os/models/__init__.py +136 -0
  89. empathy_os/models/__main__.py +13 -0
  90. empathy_os/models/cli.py +655 -0
  91. empathy_os/models/empathy_executor.py +354 -0
  92. empathy_os/models/executor.py +252 -0
  93. empathy_os/models/fallback.py +671 -0
  94. empathy_os/models/provider_config.py +563 -0
  95. empathy_os/models/registry.py +382 -0
  96. empathy_os/models/tasks.py +302 -0
  97. empathy_os/models/telemetry.py +548 -0
  98. empathy_os/models/token_estimator.py +378 -0
  99. empathy_os/models/validation.py +274 -0
  100. empathy_os/monitoring/__init__.py +52 -0
  101. empathy_os/monitoring/alerts.py +23 -0
  102. empathy_os/monitoring/alerts_cli.py +268 -0
  103. empathy_os/monitoring/multi_backend.py +271 -0
  104. empathy_os/monitoring/otel_backend.py +363 -0
  105. empathy_os/optimization/__init__.py +19 -0
  106. empathy_os/optimization/context_optimizer.py +272 -0
  107. empathy_os/plugins/__init__.py +28 -0
  108. empathy_os/plugins/base.py +361 -0
  109. empathy_os/plugins/registry.py +268 -0
  110. empathy_os/project_index/__init__.py +30 -0
  111. empathy_os/project_index/cli.py +335 -0
  112. empathy_os/project_index/crew_integration.py +430 -0
  113. empathy_os/project_index/index.py +425 -0
  114. empathy_os/project_index/models.py +501 -0
  115. empathy_os/project_index/reports.py +473 -0
  116. empathy_os/project_index/scanner.py +538 -0
  117. empathy_os/prompts/__init__.py +61 -0
  118. empathy_os/prompts/config.py +77 -0
  119. empathy_os/prompts/context.py +177 -0
  120. empathy_os/prompts/parser.py +285 -0
  121. empathy_os/prompts/registry.py +313 -0
  122. empathy_os/prompts/templates.py +208 -0
  123. empathy_os/resilience/__init__.py +56 -0
  124. empathy_os/resilience/circuit_breaker.py +256 -0
  125. empathy_os/resilience/fallback.py +179 -0
  126. empathy_os/resilience/health.py +300 -0
  127. empathy_os/resilience/retry.py +209 -0
  128. empathy_os/resilience/timeout.py +135 -0
  129. empathy_os/routing/__init__.py +43 -0
  130. empathy_os/routing/chain_executor.py +433 -0
  131. empathy_os/routing/classifier.py +217 -0
  132. empathy_os/routing/smart_router.py +234 -0
  133. empathy_os/routing/wizard_registry.py +307 -0
  134. empathy_os/trust/__init__.py +28 -0
  135. empathy_os/trust/circuit_breaker.py +579 -0
  136. empathy_os/validation/__init__.py +19 -0
  137. empathy_os/validation/xml_validator.py +281 -0
  138. empathy_os/wizard_factory_cli.py +170 -0
  139. empathy_os/workflows/__init__.py +360 -0
  140. empathy_os/workflows/base.py +1530 -0
  141. empathy_os/workflows/bug_predict.py +962 -0
  142. empathy_os/workflows/code_review.py +960 -0
  143. empathy_os/workflows/code_review_adapters.py +310 -0
  144. empathy_os/workflows/code_review_pipeline.py +720 -0
  145. empathy_os/workflows/config.py +600 -0
  146. empathy_os/workflows/dependency_check.py +648 -0
  147. empathy_os/workflows/document_gen.py +1069 -0
  148. empathy_os/workflows/documentation_orchestrator.py +1205 -0
  149. empathy_os/workflows/health_check.py +679 -0
  150. empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
  151. empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
  152. empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
  153. empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
  154. empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
  155. empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
  156. empathy_os/workflows/manage_documentation.py +804 -0
  157. empathy_os/workflows/new_sample_workflow1.py +146 -0
  158. empathy_os/workflows/new_sample_workflow1_README.md +150 -0
  159. empathy_os/workflows/perf_audit.py +687 -0
  160. empathy_os/workflows/pr_review.py +748 -0
  161. empathy_os/workflows/progress.py +445 -0
  162. empathy_os/workflows/progress_server.py +322 -0
  163. empathy_os/workflows/refactor_plan.py +691 -0
  164. empathy_os/workflows/release_prep.py +808 -0
  165. empathy_os/workflows/research_synthesis.py +404 -0
  166. empathy_os/workflows/secure_release.py +585 -0
  167. empathy_os/workflows/security_adapters.py +297 -0
  168. empathy_os/workflows/security_audit.py +1050 -0
  169. empathy_os/workflows/step_config.py +234 -0
  170. empathy_os/workflows/test5.py +125 -0
  171. empathy_os/workflows/test5_README.md +158 -0
  172. empathy_os/workflows/test_gen.py +1855 -0
  173. empathy_os/workflows/test_lifecycle.py +526 -0
  174. empathy_os/workflows/test_maintenance.py +626 -0
  175. empathy_os/workflows/test_maintenance_cli.py +590 -0
  176. empathy_os/workflows/test_maintenance_crew.py +821 -0
  177. empathy_os/workflows/xml_enhanced_crew.py +285 -0
  178. empathy_software_plugin/cli/__init__.py +120 -0
  179. empathy_software_plugin/cli/inspect.py +362 -0
  180. empathy_software_plugin/cli.py +3 -1
  181. empathy_software_plugin/wizards/__init__.py +42 -0
  182. empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
  183. empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
  184. empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
  185. empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
  186. empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
  187. empathy_software_plugin/wizards/base_wizard.py +288 -0
  188. empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
  189. empathy_software_plugin/wizards/code_review_wizard.py +606 -0
  190. empathy_software_plugin/wizards/debugging/__init__.py +50 -0
  191. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
  192. empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
  193. empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
  194. empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
  195. empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
  196. empathy_software_plugin/wizards/debugging/verification.py +369 -0
  197. empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
  198. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
  199. empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
  200. empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
  201. empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
  202. empathy_software_plugin/wizards/performance/__init__.py +9 -0
  203. empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
  204. empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
  205. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
  206. empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
  207. empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
  208. empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
  209. empathy_software_plugin/wizards/security/__init__.py +32 -0
  210. empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
  211. empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
  212. empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
  213. empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
  214. empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
  215. empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
  216. empathy_software_plugin/wizards/testing/__init__.py +27 -0
  217. empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
  218. empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
  219. empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
  220. empathy_software_plugin/wizards/testing_wizard.py +274 -0
  221. hot_reload/README.md +473 -0
  222. hot_reload/__init__.py +62 -0
  223. hot_reload/config.py +84 -0
  224. hot_reload/integration.py +228 -0
  225. hot_reload/reloader.py +298 -0
  226. hot_reload/watcher.py +179 -0
  227. hot_reload/websocket.py +176 -0
  228. scaffolding/README.md +589 -0
  229. scaffolding/__init__.py +35 -0
  230. scaffolding/__main__.py +14 -0
  231. scaffolding/cli.py +240 -0
  232. test_generator/__init__.py +38 -0
  233. test_generator/__main__.py +14 -0
  234. test_generator/cli.py +226 -0
  235. test_generator/generator.py +325 -0
  236. test_generator/risk_analyzer.py +216 -0
  237. workflow_patterns/__init__.py +33 -0
  238. workflow_patterns/behavior.py +249 -0
  239. workflow_patterns/core.py +76 -0
  240. workflow_patterns/output.py +99 -0
  241. workflow_patterns/registry.py +255 -0
  242. workflow_patterns/structural.py +288 -0
  243. workflow_scaffolding/__init__.py +11 -0
  244. workflow_scaffolding/__main__.py +12 -0
  245. workflow_scaffolding/cli.py +206 -0
  246. workflow_scaffolding/generator.py +265 -0
  247. agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
  248. agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
  249. agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
  250. agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
  251. agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
  252. agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
  253. agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
  254. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
  255. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
  256. agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
  257. agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
  258. agents/compliance_anticipation_agent.py +0 -1422
  259. agents/compliance_db.py +0 -339
  260. agents/epic_integration_wizard.py +0 -530
  261. agents/notifications.py +0 -291
  262. agents/trust_building_behaviors.py +0 -872
  263. empathy_framework-3.7.0.dist-info/RECORD +0 -105
  264. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/WHEEL +0 -0
  265. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/entry_points.txt +0 -0
  266. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/licenses/LICENSE +0 -0
  267. /empathy_os/{monitoring.py → agent_monitoring.py} +0 -0
@@ -0,0 +1,335 @@
1
+ """CLI for Project Index
2
+
3
+ Commands for generating, querying, and reporting on the project index.
4
+
5
+ Usage:
6
+ python -m empathy_os.project_index.cli refresh
7
+ python -m empathy_os.project_index.cli report health
8
+ python -m empathy_os.project_index.cli query needing_tests
9
+ python -m empathy_os.project_index.cli summary
10
+
11
+ Copyright 2025 Smart AI Memory, LLC
12
+ Licensed under Fair Source 0.9
13
+ """
14
+
15
+ import argparse
16
+ import json
17
+ import sys
18
+ from pathlib import Path
19
+
20
+ from .index import ProjectIndex
21
+ from .reports import ReportGenerator
22
+
23
+
24
+ def main() -> int:
25
+ """Main CLI entry point."""
26
+ parser = argparse.ArgumentParser(
27
+ description="Project Index - Codebase Intelligence",
28
+ formatter_class=argparse.RawDescriptionHelpFormatter,
29
+ epilog="""
30
+ Examples:
31
+ # Generate/refresh the index
32
+ python -m empathy_os.project_index.cli refresh
33
+
34
+ # View project summary
35
+ python -m empathy_os.project_index.cli summary
36
+
37
+ # Generate health report
38
+ python -m empathy_os.project_index.cli report health
39
+
40
+ # Find files needing tests
41
+ python -m empathy_os.project_index.cli query needing_tests
42
+
43
+ # Find stale test files
44
+ python -m empathy_os.project_index.cli query stale
45
+ """,
46
+ )
47
+
48
+ parser.add_argument(
49
+ "--project",
50
+ "-p",
51
+ default=".",
52
+ help="Project root directory (default: current directory)",
53
+ )
54
+
55
+ parser.add_argument(
56
+ "--json",
57
+ "-j",
58
+ action="store_true",
59
+ help="Output in JSON format",
60
+ )
61
+
62
+ subparsers = parser.add_subparsers(dest="command", help="Command to run")
63
+
64
+ # refresh command
65
+ refresh_parser = subparsers.add_parser("refresh", help="Refresh the project index")
66
+ refresh_parser.add_argument(
67
+ "--force",
68
+ "-f",
69
+ action="store_true",
70
+ help="Force full re-scan even if index exists",
71
+ )
72
+
73
+ # summary command
74
+ subparsers.add_parser("summary", help="Show project summary")
75
+
76
+ # report command
77
+ report_parser = subparsers.add_parser("report", help="Generate a report")
78
+ report_parser.add_argument(
79
+ "report_type",
80
+ choices=["health", "test_gap", "staleness", "coverage", "sprint"],
81
+ help="Type of report to generate",
82
+ )
83
+ report_parser.add_argument(
84
+ "--markdown",
85
+ "-m",
86
+ action="store_true",
87
+ help="Output in markdown format",
88
+ )
89
+
90
+ # query command
91
+ query_parser = subparsers.add_parser("query", help="Query the index")
92
+ query_parser.add_argument(
93
+ "query_type",
94
+ choices=["needing_tests", "stale", "high_impact", "attention", "all"],
95
+ help="Type of query",
96
+ )
97
+ query_parser.add_argument(
98
+ "--limit",
99
+ "-l",
100
+ type=int,
101
+ default=20,
102
+ help="Maximum number of results",
103
+ )
104
+
105
+ # file command
106
+ file_parser = subparsers.add_parser("file", help="Get info about a specific file")
107
+ file_parser.add_argument("path", help="Path to the file")
108
+
109
+ args = parser.parse_args()
110
+
111
+ if not args.command:
112
+ parser.print_help()
113
+ return 1
114
+
115
+ # Initialize index
116
+ project_root = Path(args.project).resolve()
117
+ index = ProjectIndex(str(project_root))
118
+
119
+ # Execute command
120
+ if args.command == "refresh":
121
+ return cmd_refresh(index, args)
122
+ if args.command == "summary":
123
+ return cmd_summary(index, args)
124
+ if args.command == "report":
125
+ return cmd_report(index, args)
126
+ if args.command == "query":
127
+ return cmd_query(index, args)
128
+ if args.command == "file":
129
+ return cmd_file(index, args)
130
+
131
+ return 0
132
+
133
+
134
+ def cmd_refresh(index: ProjectIndex, args: argparse.Namespace) -> int:
135
+ """Refresh the index."""
136
+ print(f"Refreshing index for: {index.project_root}")
137
+ print()
138
+
139
+ index.refresh()
140
+
141
+ summary = index.get_summary()
142
+
143
+ print("Index refreshed successfully!")
144
+ print(f" Files indexed: {summary.total_files}")
145
+ print(f" Source files: {summary.source_files}")
146
+ print(f" Test files: {summary.test_files}")
147
+ print(f" Files needing tests: {summary.files_without_tests}")
148
+ print(f" Files needing attention: {summary.files_needing_attention}")
149
+ print()
150
+ print(f"Index saved to: {index._index_path}")
151
+
152
+ return 0
153
+
154
+
155
+ def cmd_summary(index: ProjectIndex, args: argparse.Namespace) -> int:
156
+ """Show project summary."""
157
+ if not index.load():
158
+ print("No index found. Run 'refresh' first.")
159
+ return 1
160
+
161
+ summary = index.get_summary()
162
+
163
+ if args.json:
164
+ print(json.dumps(summary.to_dict(), indent=2))
165
+ return 0
166
+
167
+ print("=" * 60)
168
+ print("PROJECT INDEX SUMMARY")
169
+ print("=" * 60)
170
+ print()
171
+ print("FILE COUNTS")
172
+ print(f" Total files: {summary.total_files}")
173
+ print(f" Source files: {summary.source_files}")
174
+ print(f" Test files: {summary.test_files}")
175
+ print(f" Config files: {summary.config_files}")
176
+ print(f" Doc files: {summary.doc_files}")
177
+ print()
178
+ print("TEST HEALTH")
179
+ print(f" Files requiring tests: {summary.files_requiring_tests}")
180
+ print(f" Files with tests: {summary.files_with_tests}")
181
+ print(f" Files WITHOUT tests: {summary.files_without_tests}")
182
+ print(f" Average coverage: {summary.test_coverage_avg:.1f}%")
183
+ print(f" Test-to-code ratio: {summary.test_to_code_ratio:.2f}")
184
+ print()
185
+ print("ATTENTION NEEDED")
186
+ print(f" Stale test count: {summary.stale_file_count}")
187
+ print(f" Files need attention: {summary.files_needing_attention}")
188
+ print()
189
+
190
+ if summary.critical_untested_files:
191
+ print("CRITICAL UNTESTED FILES (high impact)")
192
+ for f in summary.critical_untested_files[:5]:
193
+ print(f" - {f}")
194
+ print()
195
+
196
+ return 0
197
+
198
+
199
+ def cmd_report(index: ProjectIndex, args: argparse.Namespace) -> int:
200
+ """Generate a report."""
201
+ if not index.load():
202
+ print("No index found. Run 'refresh' first.")
203
+ return 1
204
+
205
+ generator = ReportGenerator(index.get_summary(), index.get_all_files())
206
+
207
+ report_type = args.report_type
208
+ if report_type == "sprint":
209
+ report_type = "sprint_planning"
210
+
211
+ # Generate report
212
+ if args.markdown:
213
+ print(generator.to_markdown(report_type))
214
+ elif args.json:
215
+ if report_type == "health":
216
+ print(json.dumps(generator.health_report(), indent=2))
217
+ elif report_type == "test_gap":
218
+ print(json.dumps(generator.test_gap_report(), indent=2))
219
+ elif report_type == "staleness":
220
+ print(json.dumps(generator.staleness_report(), indent=2))
221
+ elif report_type == "coverage":
222
+ print(json.dumps(generator.coverage_report(), indent=2))
223
+ elif report_type == "sprint_planning":
224
+ print(json.dumps(generator.sprint_planning_report(), indent=2))
225
+ else:
226
+ # Human-readable format
227
+ print(generator.to_markdown(report_type))
228
+
229
+ return 0
230
+
231
+
232
+ def cmd_query(index: ProjectIndex, args: argparse.Namespace) -> int:
233
+ """Query the index."""
234
+ if not index.load():
235
+ print("No index found. Run 'refresh' first.")
236
+ return 1
237
+
238
+ query_type = args.query_type
239
+ limit = args.limit
240
+
241
+ # Execute query
242
+ if query_type == "needing_tests":
243
+ files = index.get_files_needing_tests()[:limit]
244
+ title = "FILES NEEDING TESTS"
245
+ elif query_type == "stale":
246
+ files = index.get_stale_files()[:limit]
247
+ title = "STALE TEST FILES"
248
+ elif query_type == "high_impact":
249
+ files = index.get_high_impact_files()[:limit]
250
+ title = "HIGH IMPACT FILES"
251
+ elif query_type == "attention":
252
+ files = index.get_files_needing_attention()[:limit]
253
+ title = "FILES NEEDING ATTENTION"
254
+ elif query_type == "all":
255
+ files = index.get_all_files()[:limit]
256
+ title = "ALL FILES"
257
+ else:
258
+ files = []
259
+ title = "RESULTS"
260
+
261
+ if args.json:
262
+ print(json.dumps([f.to_dict() for f in files], indent=2))
263
+ return 0
264
+
265
+ print(f"\n{title} ({len(files)} results)")
266
+ print("=" * 60)
267
+
268
+ for f in files:
269
+ print(f"\n{f.path}")
270
+ print(f" Category: {f.category.value}")
271
+ print(f" Impact Score: {f.impact_score:.1f}")
272
+ print(f" Has Tests: {f.tests_exist}")
273
+ print(f" Coverage: {f.coverage_percent:.1f}%")
274
+ if f.is_stale:
275
+ print(f" STALE: {f.staleness_days} days")
276
+ if f.attention_reasons:
277
+ print(f" Attention: {', '.join(f.attention_reasons)}")
278
+
279
+ print()
280
+ return 0
281
+
282
+
283
+ def cmd_file(index: ProjectIndex, args: argparse.Namespace) -> int:
284
+ """Get info about a specific file."""
285
+ if not index.load():
286
+ print("No index found. Run 'refresh' first.")
287
+ return 1
288
+
289
+ record = index.get_file(args.path)
290
+
291
+ if not record:
292
+ print(f"File not found in index: {args.path}")
293
+ return 1
294
+
295
+ if args.json:
296
+ print(json.dumps(record.to_dict(), indent=2))
297
+ return 0
298
+
299
+ print(f"\nFILE: {record.path}")
300
+ print("=" * 60)
301
+ print(f" Name: {record.name}")
302
+ print(f" Category: {record.category.value}")
303
+ print(f" Language: {record.language}")
304
+ print()
305
+ print("TESTING")
306
+ print(f" Requires Tests: {record.test_requirement.value}")
307
+ print(f" Has Tests: {record.tests_exist}")
308
+ print(f" Test File: {record.test_file_path or 'None'}")
309
+ print(f" Coverage: {record.coverage_percent:.1f}%")
310
+ print(f" Test Count: {record.test_count}")
311
+ print()
312
+ print("METRICS")
313
+ print(f" Lines of Code: {record.lines_of_code}")
314
+ print(f" Complexity: {record.complexity_score:.1f}")
315
+ print(f" Has Docstrings: {record.has_docstrings}")
316
+ print(f" Has Type Hints: {record.has_type_hints}")
317
+ print()
318
+ print("DEPENDENCIES")
319
+ print(f" Imports: {record.import_count} modules")
320
+ print(f" Imported By: {record.imported_by_count} files")
321
+ print(f" Impact Score: {record.impact_score:.1f}")
322
+ print()
323
+ print("STATUS")
324
+ print(f" Needs Attention: {record.needs_attention}")
325
+ if record.attention_reasons:
326
+ print(f" Reasons: {', '.join(record.attention_reasons)}")
327
+ if record.is_stale:
328
+ print(f" STALE: {record.staleness_days} days")
329
+ print()
330
+
331
+ return 0
332
+
333
+
334
+ if __name__ == "__main__":
335
+ sys.exit(main())