gitflow-analytics 3.13.24__tar.gz → 3.13.26__tar.gz

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 (409) hide show
  1. {gitflow_analytics-3.13.24/src/gitflow_analytics.egg-info → gitflow_analytics-3.13.26}/PKG-INFO +1 -1
  2. gitflow_analytics-3.13.26/docs/research/issues-21-22-implementation-research-2026-04-08.md +335 -0
  3. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/_version.py +1 -1
  4. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli.py +1 -7
  5. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_analysis_modes.py +1 -1
  6. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_analysis_orchestrator.py +6 -10
  7. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_fetch.py +0 -1
  8. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_wizards/install_wizard.py +0 -3
  9. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_wizards/install_wizard_output.py +0 -2
  10. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_wizards/install_wizard_pm.py +0 -2
  11. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_wizards/install_wizard_repos.py +0 -3
  12. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/config/loader.py +1 -0
  13. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/config/schema.py +11 -0
  14. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/analyzer.py +2 -10
  15. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/analyzer_commit.py +2 -13
  16. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/analyzer_git.py +0 -12
  17. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/cache_weekly.py +1 -10
  18. gitflow_analytics-3.13.26/src/gitflow_analytics/core/churn_calculator.py +109 -0
  19. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/data_fetcher_git.py +1 -22
  20. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/data_fetcher_parallel.py +3 -23
  21. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/data_fetcher_processing.py +1 -18
  22. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/metrics_storage.py +131 -34
  23. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/repo_cloner.py +1 -1
  24. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/extractors/tickets.py +8 -0
  25. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/extractors/tickets_analysis.py +33 -0
  26. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/models/database.py +96 -0
  27. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/models/database_commit_models.py +14 -14
  28. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/models/database_identity_models.py +2 -5
  29. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pipeline.py +4 -3
  30. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pm_framework/adapters/jira_adapter.py +1 -3
  31. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pm_framework/adapters/jira_cache.py +0 -1
  32. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/enhanced_analyzer.py +1 -4
  33. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/enhanced_analyzer_developer.py +1 -7
  34. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/enhanced_analyzer_executive.py +1 -8
  35. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/enhanced_analyzer_projects.py +2 -7
  36. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/enhanced_analyzer_workflow.py +1 -4
  37. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/classification_writer.py +1 -1
  38. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/csv_reports_weekly.py +0 -2
  39. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/csv_writer.py +2 -3
  40. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/html_generator.py +1 -1
  41. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/html_sections.py +1 -1
  42. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/json_export_builders.py +1 -5
  43. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/json_export_developer.py +2 -6
  44. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/json_export_executive.py +2 -6
  45. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/json_export_insights.py +1 -5
  46. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/json_export_utils.py +2 -2
  47. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/json_exporter.py +3 -8
  48. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/narrative_classification.py +0 -1
  49. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/narrative_executive.py +0 -2
  50. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/narrative_recommendations.py +0 -2
  51. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/narrative_team.py +0 -2
  52. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/narrative_writer.py +4 -4
  53. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/weekly_trends_writer.py +116 -1
  54. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/ui/progress_display.py +2 -3
  55. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/ui/progress_display_rich.py +2 -5
  56. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/ui/progress_display_rich_render.py +0 -5
  57. gitflow_analytics-3.13.26/src/gitflow_analytics/utils/ai_detection.py +86 -0
  58. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26/src/gitflow_analytics.egg-info}/PKG-INFO +1 -1
  59. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics.egg-info/SOURCES.txt +7 -0
  60. gitflow_analytics-3.13.26/tests/core/test_churn_calculator.py +331 -0
  61. gitflow_analytics-3.13.26/tests/models/test_daily_metrics_ai_columns.py +230 -0
  62. gitflow_analytics-3.13.26/tests/models/test_weekly_trends_churn_column.py +211 -0
  63. gitflow_analytics-3.13.26/tests/utils/test_ai_detection.py +190 -0
  64. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/CHANGELOG.md +0 -0
  65. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/CLAUDE.md +0 -0
  66. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/LICENSE +0 -0
  67. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/MANIFEST.in +0 -0
  68. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/README.md +0 -0
  69. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/DOCUMENTATION-STANDARDS.md +0 -0
  70. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/README.md +0 -0
  71. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/SECURITY.md +0 -0
  72. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/STRUCTURE.md +0 -0
  73. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/README.md +0 -0
  74. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/analysis-files/ewtn-critical-security-report.md +0 -0
  75. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_engineer_20250915_085239_236.md +0 -0
  76. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_engineer_20250915_114233_697.md +0 -0
  77. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_engineer_20250915_115330_511.md +0 -0
  78. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_engineer_20250915_120516_669.md +0 -0
  79. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_engineer_20250915_124906_951.md +0 -0
  80. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_engineer_20250915_175540_671.md +0 -0
  81. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_engineer_20250915_214023_300.md +0 -0
  82. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_engineer_20250916_130622_510.md +0 -0
  83. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_ops_20250915_123323_419.md +0 -0
  84. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_ops_20250915_134446_128.md +0 -0
  85. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_ops_20250915_184656_725.md +0 -0
  86. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_research_20250915_091233_023.md +0 -0
  87. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_research_20250915_100404_339.md +0 -0
  88. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/agent_research_20250915_110606_413.md +0 -0
  89. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/system_prompt_20250915_084833_641.md +0 -0
  90. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/system_prompt_20250915_090830_660.md +0 -0
  91. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-logs/prompts/system_prompt_20250916_130545_822.md +0 -0
  92. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-reports/output/database_qualitative_report_20250630_20250824.md +0 -0
  93. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-reports/output/narrative_report_20250630_20250824.md +0 -0
  94. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-reports/reports-24week/database_qualitative_report_20250303_20250817.md +0 -0
  95. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-reports/reports-24week/narrative_report_20250303_20250817.md +0 -0
  96. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-reports/test-ewtn-reports/narrative_report_20250810.md +0 -0
  97. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-reports/test-reports/database_qualitative_report_20250908_20250914.md +0 -0
  98. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-reports/test-reports/narrative_report_20250908_20250914.md +0 -0
  99. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-reports/test-weekly-reports/database_qualitative_report_20250623_20250817.md +0 -0
  100. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/old-reports/test-weekly-reports/narrative_report_20250623_20250817.md +0 -0
  101. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/CHANGELOG_INTERACTIVE_LAUNCHER.md +0 -0
  102. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/CLEANUP_SUMMARY-20250929.md +0 -0
  103. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/FEATURES_READY_FOR_TESTING.md +0 -0
  104. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/FIX_SUMMARY.md +0 -0
  105. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/IMPLEMENTATION_SUMMARY.md +0 -0
  106. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/PROGRESS_TRACKING_FIXES.md +0 -0
  107. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/PROJECT_CLEANUP_REPORT-20250929.md +0 -0
  108. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/README.md +0 -0
  109. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/STORY_POINTS_CONFIG_SUMMARY-archived.md +0 -0
  110. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/SYNTAX_ERROR_FIX.md +0 -0
  111. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/TEST_REPORT_GIT_CLONING.md +0 -0
  112. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/TIMEZONE_BUG_RESOLUTION.md +0 -0
  113. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/USAGE_EXAMPLES-archived.md +0 -0
  114. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/_archive/temp-files/code_analysis_report.md +0 -0
  115. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/architecture/README.md +0 -0
  116. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/architecture/branch-analysis-optimization.md +0 -0
  117. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/architecture/caching-strategy.md +0 -0
  118. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/architecture/llm-classifier-refactoring.md +0 -0
  119. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/architecture/ml-pipeline.md +0 -0
  120. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/cicd-integration-implementation-summary.md +0 -0
  121. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/configuration/configuration.md +0 -0
  122. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/deployment/README.md +0 -0
  123. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/design/README.md +0 -0
  124. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/design/circuit-breaker-implementation.md +0 -0
  125. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/design/commit-classification-design.md +0 -0
  126. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/design/git_pm_correlation_design.md +0 -0
  127. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/design/platform-agnostic-pm-framework.md +0 -0
  128. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/design/qualitative_data_extraction.md +0 -0
  129. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/developer/README.md +0 -0
  130. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/developer/contributing.md +0 -0
  131. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/developer/development-setup.md +0 -0
  132. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/developer/project-organization.md +0 -0
  133. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/developer/refactoring-guide.md +0 -0
  134. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/developer/training-guide.md +0 -0
  135. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/examples/README.md +0 -0
  136. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/examples/interactive-launcher-examples.md +0 -0
  137. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/examples/story-points-configuration.md +0 -0
  138. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/getting-started/README.md +0 -0
  139. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/getting-started/first-analysis.md +0 -0
  140. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/getting-started/installation.md +0 -0
  141. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/getting-started/quickstart.md +0 -0
  142. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/guides/LLM_CLASSIFICATION_GUIDE.md +0 -0
  143. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/guides/README.md +0 -0
  144. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/guides/chatgpt-setup.md +0 -0
  145. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/guides/identity-resolution-enhanced.md +0 -0
  146. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/guides/interactive-launcher.md +0 -0
  147. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/guides/managing-aliases.md +0 -0
  148. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/guides/ml-categorization.md +0 -0
  149. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/guides/pm-platform-setup.md +0 -0
  150. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/guides/troubleshooting.md +0 -0
  151. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/managers/README.md +0 -0
  152. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/managers/dashboard-guide.md +0 -0
  153. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/managers/faq.md +0 -0
  154. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/managers/interpreting-reports.md +0 -0
  155. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/managers/metrics-reference.md +0 -0
  156. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/managers/quickstart.md +0 -0
  157. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/quick-reference/launcher-and-identity.md +0 -0
  158. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/reference/README.md +0 -0
  159. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/reference/cache-system.md +0 -0
  160. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/reference/cli-commands.md +0 -0
  161. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/reference/configuration-schema.md +0 -0
  162. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/reference/json-export-schema.md +0 -0
  163. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/bedrock-classify-fallback-debug-2026-02-26.md +0 -0
  164. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/bedrock-llm-not-called-2026-02-27.md +0 -0
  165. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/bug-investigation-issues-2-3-4-2026-02-03.md +0 -0
  166. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/cache-missing-repos-investigation-2026-02-27.md +0 -0
  167. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/cicd-integration-patterns-2025-02-09.md +0 -0
  168. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/classify-pipeline-reclassify-feature-2026-02-26.md +0 -0
  169. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/cli-refactoring-plan-2026-02-26.md +0 -0
  170. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/code-review-low-hanging-fruit-2026-02-25.md +0 -0
  171. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/commit-classification-complexity-field-2026-02-27.md +0 -0
  172. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/commit-classification-verification-2026-02-26.md +0 -0
  173. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/csv-generation-narrative-bug-20251222.md +0 -0
  174. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/data-fetching-architecture-2026-02-26.md +0 -0
  175. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/github-auth-requirement-investigation-2026-02-25.md +0 -0
  176. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/identity-alias-system-2026-02-26.md +0 -0
  177. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/identity-resolution-architecture-2026-02-27.md +0 -0
  178. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/manager-onboarding-documentation-analysis-2026-02-03.md +0 -0
  179. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/memory-leak-analysis-2026-02-26.md +0 -0
  180. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/narrative-report-developer-names-2026-02-27.md +0 -0
  181. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/pipeline-data-points-audit-2026-02-27.md +0 -0
  182. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/pr-data-model-and-status-tracking-2026-02-26.md +0 -0
  183. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/pr-fetching-report-vs-analyze-2026-02-27.md +0 -0
  184. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/pr-tracking-and-alias-gap-analysis-2026-02-25.md +0 -0
  185. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/pr-tracking-capabilities-analysis-2026-02-25.md +0 -0
  186. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/qa-report-2026-02-16-week.md +0 -0
  187. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/test-cli-memory-leak-root-cause-2026-02-26.md +0 -0
  188. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/docs/research/week-segmentation-bug-investigation-2026-02-25.md +0 -0
  189. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/pyproject.toml +0 -0
  190. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/setup.cfg +0 -0
  191. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/__init__.py +0 -0
  192. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/classification/__init__.py +0 -0
  193. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/classification/batch_classifier.py +0 -0
  194. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/classification/batch_classifier_impl.py +0 -0
  195. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/classification/classifier.py +0 -0
  196. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/classification/feature_extractor.py +0 -0
  197. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/classification/linguist_analyzer.py +0 -0
  198. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/classification/model.py +0 -0
  199. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_analysis.py +0 -0
  200. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_analysis_helpers.py +0 -0
  201. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_formatting.py +0 -0
  202. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_identity.py +0 -0
  203. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_identity_alias_ops.py +0 -0
  204. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_identity_commands.py +0 -0
  205. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_pipeline_commands.py +0 -0
  206. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_setup.py +0 -0
  207. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_training.py +0 -0
  208. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_utils.py +0 -0
  209. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_wizards/__init__.py +0 -0
  210. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_wizards/menu.py +0 -0
  211. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/cli_wizards/run_launcher.py +0 -0
  212. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/config/__init__.py +0 -0
  213. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/config/aliases.py +0 -0
  214. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/config/errors.py +0 -0
  215. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/config/loader_sections.py +0 -0
  216. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/config/profiles.py +0 -0
  217. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/config/repository.py +0 -0
  218. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/config/validator.py +0 -0
  219. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/config.py +0 -0
  220. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/constants.py +0 -0
  221. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/__init__.py +0 -0
  222. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/analysis_components.py +0 -0
  223. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/analyze_pipeline.py +0 -0
  224. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/analyze_pipeline_helpers.py +0 -0
  225. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/analyze_pipeline_reports.py +0 -0
  226. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/branch_mapper.py +0 -0
  227. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/cache.py +0 -0
  228. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/cache_commits.py +0 -0
  229. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/data_fetcher.py +0 -0
  230. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/git_auth.py +0 -0
  231. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/git_timeout_wrapper.py +0 -0
  232. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/identity.py +0 -0
  233. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/identity_stats.py +0 -0
  234. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/progress.py +0 -0
  235. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/schema_version.py +0 -0
  236. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/core/subprocess_git.py +0 -0
  237. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/extractors/__init__.py +0 -0
  238. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/extractors/base.py +0 -0
  239. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/extractors/ml_prediction_cache.py +0 -0
  240. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/extractors/ml_tickets.py +0 -0
  241. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/extractors/ml_tickets_analysis.py +0 -0
  242. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/extractors/story_points.py +0 -0
  243. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/identity_llm/__init__.py +0 -0
  244. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/identity_llm/analysis_pass.py +0 -0
  245. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/identity_llm/analyzer.py +0 -0
  246. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/identity_llm/models.py +0 -0
  247. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/integrations/__init__.py +0 -0
  248. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/integrations/cicd/__init__.py +0 -0
  249. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/integrations/cicd/base.py +0 -0
  250. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/integrations/cicd/github_actions.py +0 -0
  251. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/integrations/github_integration.py +0 -0
  252. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/integrations/jira_integration.py +0 -0
  253. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/integrations/orchestrator.py +0 -0
  254. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/metrics/__init__.py +0 -0
  255. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/metrics/activity_scoring.py +0 -0
  256. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/metrics/branch_health.py +0 -0
  257. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/metrics/dora.py +0 -0
  258. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/models/__init__.py +0 -0
  259. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/models/database_base.py +0 -0
  260. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/models/database_metrics_models.py +0 -0
  261. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pipeline_classify.py +0 -0
  262. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pipeline_collect.py +0 -0
  263. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pipeline_report.py +0 -0
  264. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pipeline_types.py +0 -0
  265. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pm_framework/__init__.py +0 -0
  266. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pm_framework/adapters/__init__.py +0 -0
  267. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pm_framework/adapters/jira_adapter_converters.py +0 -0
  268. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pm_framework/base.py +0 -0
  269. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pm_framework/models.py +0 -0
  270. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pm_framework/orchestrator.py +0 -0
  271. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/pm_framework/registry.py +0 -0
  272. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/__init__.py +0 -0
  273. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/chatgpt_analyzer.py +0 -0
  274. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/__init__.py +0 -0
  275. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/change_type.py +0 -0
  276. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/domain_classifier.py +0 -0
  277. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/intent_analyzer.py +0 -0
  278. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/llm/__init__.py +0 -0
  279. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/llm/base.py +0 -0
  280. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/llm/batch_processor.py +0 -0
  281. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/llm/bedrock_client.py +0 -0
  282. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/llm/cache.py +0 -0
  283. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/llm/cost_tracker.py +0 -0
  284. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/llm/openai_client.py +0 -0
  285. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/llm/prompts.py +0 -0
  286. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/llm/response_parser.py +0 -0
  287. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/llm_commit_classifier.py +0 -0
  288. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/classifiers/risk_analyzer.py +0 -0
  289. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/core/__init__.py +0 -0
  290. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/core/llm_fallback.py +0 -0
  291. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/core/nlp_engine.py +0 -0
  292. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/core/pattern_cache.py +0 -0
  293. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/core/processor.py +0 -0
  294. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/example_enhanced_usage.py +0 -0
  295. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/models/__init__.py +0 -0
  296. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/models/schemas.py +0 -0
  297. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/utils/__init__.py +0 -0
  298. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/utils/batch_processor.py +0 -0
  299. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/utils/cost_tracker.py +0 -0
  300. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/utils/metrics.py +0 -0
  301. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/qualitative/utils/text_processing.py +0 -0
  302. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/__init__.py +0 -0
  303. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/analytics_patterns.py +0 -0
  304. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/analytics_writer.py +0 -0
  305. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/base.py +0 -0
  306. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/branch_health_writer.py +0 -0
  307. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/classification_csv.py +0 -0
  308. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/cli_integration.py +0 -0
  309. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/csv_reports_developer.py +0 -0
  310. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/csv_reports_dora.py +0 -0
  311. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/data_models.py +0 -0
  312. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/database_report_generator.py +0 -0
  313. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/example_usage.py +0 -0
  314. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/factory.py +0 -0
  315. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/formatters.py +0 -0
  316. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/interfaces.py +0 -0
  317. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/narrative_analysis.py +0 -0
  318. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/story_point_correlation.py +0 -0
  319. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/reports/story_point_helpers.py +0 -0
  320. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/security/__init__.py +0 -0
  321. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/security/config.py +0 -0
  322. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/security/extractors/__init__.py +0 -0
  323. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/security/extractors/dependency_checker.py +0 -0
  324. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/security/extractors/secret_detector.py +0 -0
  325. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/security/extractors/vulnerability_scanner.py +0 -0
  326. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/security/llm_analyzer.py +0 -0
  327. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/security/reports/__init__.py +0 -0
  328. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/security/reports/security_report.py +0 -0
  329. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/security/security_analyzer.py +0 -0
  330. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/training/__init__.py +0 -0
  331. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/training/model_loader.py +0 -0
  332. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/training/pipeline.py +0 -0
  333. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/types/__init__.py +0 -0
  334. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/types/commit_types.py +0 -0
  335. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/ui/__init__.py +0 -0
  336. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/utils/__init__.py +0 -0
  337. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/utils/commit_utils.py +0 -0
  338. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/utils/date_utils.py +0 -0
  339. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/utils/debug.py +0 -0
  340. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/utils/glob_matcher.py +0 -0
  341. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics/verify_activity.py +0 -0
  342. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics.egg-info/dependency_links.txt +0 -0
  343. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics.egg-info/entry_points.txt +0 -0
  344. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics.egg-info/requires.txt +0 -0
  345. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/src/gitflow_analytics.egg-info/top_level.txt +0 -0
  346. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/__init__.py +0 -0
  347. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/conftest.py +0 -0
  348. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/core/__init__.py +0 -0
  349. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/core/test_analyzer.py +0 -0
  350. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/core/test_analyzer_merge_stats.py +0 -0
  351. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/core/test_cache.py +0 -0
  352. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/core/test_data_fetcher.py +0 -0
  353. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/core/test_data_fetcher_merge_stats.py +0 -0
  354. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/core/test_identity.py +0 -0
  355. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/core/test_merge_commit_detection.py +0 -0
  356. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/core/test_progress.py +0 -0
  357. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/core/test_weekly_cache.py +0 -0
  358. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/debug_bulk_exists.py +0 -0
  359. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/debug_commit_story_points.py +0 -0
  360. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/debug_database_storage.py +0 -0
  361. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/debug_jira_enrichment.py +0 -0
  362. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/debug_story_points.py +0 -0
  363. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/extractors/__init__.py +0 -0
  364. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/extractors/test_commit_categorization.py +0 -0
  365. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/extractors/test_ticket_detection_config.py +0 -0
  366. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/integration/__init__.py +0 -0
  367. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/integration/conftest.py +0 -0
  368. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/integration/test_merge_exclusion_workflow.py +0 -0
  369. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/integrations/__init__.py +0 -0
  370. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/integrations/test_github_integration.py +0 -0
  371. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/metrics/__init__.py +0 -0
  372. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/models/__init__.py +0 -0
  373. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/models/test_pull_request_cache_v3.py +0 -0
  374. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/models/test_pull_request_cache_v4.py +0 -0
  375. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/qualitative/__init__.py +0 -0
  376. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/qualitative/test_basic_integration.py +0 -0
  377. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/qualitative/test_bedrock_batch.py +0 -0
  378. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/qualitative/test_complexity_rating.py +0 -0
  379. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/reports/__init__.py +0 -0
  380. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/reports/test_pr_reporting.py +0 -0
  381. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test-qa-install/test_error_handling.py +0 -0
  382. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test-qa-install/test_wizard_automated.py +0 -0
  383. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_atomic_caching.py +0 -0
  384. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_cache_invalidation.py +0 -0
  385. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_classification_system.py +0 -0
  386. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_cli.py +0 -0
  387. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_cli_wizards/__init__.py +0 -0
  388. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_cli_wizards/test_menu.py +0 -0
  389. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_config.py +0 -0
  390. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_config_extends.py +0 -0
  391. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_config_profiles.py +0 -0
  392. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_config_story_points.py +0 -0
  393. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_identity_llm_analyzer.py +0 -0
  394. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_install_wizard.py +0 -0
  395. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_interactive_launcher.py +0 -0
  396. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_llm_commit_classification.py +0 -0
  397. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_metrics.py +0 -0
  398. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_ml_accuracy.py +0 -0
  399. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_ml_components.py +0 -0
  400. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_ml_comprehensive.py +0 -0
  401. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_ml_integration.py +0 -0
  402. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_pipeline.py +0 -0
  403. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_pm_env_resolution.py +0 -0
  404. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_report_abstraction.py +0 -0
  405. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_reports.py +0 -0
  406. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_training_pipeline.py +0 -0
  407. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/test_two_step_process.py +0 -0
  408. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/utils/__init__.py +0 -0
  409. {gitflow_analytics-3.13.24 → gitflow_analytics-3.13.26}/tests/utils/test_commit_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitflow-analytics
3
- Version: 3.13.24
3
+ Version: 3.13.26
4
4
  Summary: Analyze Git repositories for developer productivity insights
5
5
  Author-email: Bob Matyas <bobmatnyc@gmail.com>
6
6
  License: MIT
@@ -0,0 +1,335 @@
1
+ # Research: Issues #21 & #22 Implementation Map
2
+ **Date**: 2026-04-08
3
+ **Issues**:
4
+ - #21: Add per-developer AI tool usage tracking (Claude Code, Cursor, Copilot)
5
+ - #22: Add 14-day code churn rate tracking
6
+
7
+ ---
8
+
9
+ ## 1. Database Schema
10
+
11
+ ### `daily_metrics` table
12
+ **File**: `src/gitflow_analytics/models/database_commit_models.py` — class `DailyMetrics`
13
+
14
+ Current columns:
15
+ ```
16
+ id, date, developer_id, project_key,
17
+ developer_name, developer_email,
18
+ feature_commits, bug_fix_commits, refactor_commits, documentation_commits,
19
+ maintenance_commits, test_commits, style_commits, build_commits, other_commits,
20
+ total_commits, files_changed, lines_added, lines_deleted, story_points,
21
+ tracked_commits, untracked_commits, unique_tickets,
22
+ merge_commits, complex_commits,
23
+ created_at, updated_at
24
+ ```
25
+
26
+ **Gaps for Issue #21**: No AI tool columns exist (`ai_assisted_commits`, `claude_code_commits`, `cursor_commits`, `copilot_commits`).
27
+ **Gaps for Issue #22**: No churn columns exist (`churn_rate`, `lines_churned`). The `lines_added` and `lines_deleted` are present per-day; churn would need to be computed over a 14-day rolling window.
28
+
29
+ ### `weekly_trends` table
30
+ **File**: `src/gitflow_analytics/models/database_commit_models.py` — class `WeeklyTrends`
31
+
32
+ Current columns:
33
+ ```
34
+ id, week_start, week_end, developer_id, project_key,
35
+ total_commits, feature_commits, bug_fix_commits, refactor_commits,
36
+ total_commits_change, feature_commits_change, bug_fix_commits_change, refactor_commits_change,
37
+ days_active, avg_commits_per_day,
38
+ calculated_at
39
+ ```
40
+
41
+ **Gaps for Issue #21**: No AI tool usage columns.
42
+ **Gaps for Issue #22**: No churn rate columns.
43
+
44
+ ### Migration pattern
45
+ The project uses `ALTER TABLE … ADD COLUMN` inside `Database._apply_migrations()` in
46
+ `src/gitflow_analytics/models/database.py`. Each new column gets its own try/except block
47
+ to be idempotent. The pattern:
48
+
49
+ ```python
50
+ # In Database._apply_migrations():
51
+ result = conn.execute(text("PRAGMA table_info(daily_metrics)"))
52
+ columns = {row[1] for row in result}
53
+ if "ai_assisted_commits" not in columns:
54
+ conn.execute(text("ALTER TABLE daily_metrics ADD COLUMN ai_assisted_commits INTEGER DEFAULT 0"))
55
+ conn.commit()
56
+ ```
57
+
58
+ There is a `SchemaVersion` ORM model (`schema_version` table) that records version strings
59
+ like `"2.0"`. `CURRENT_SCHEMA_VERSION = "2.0"` in `Database`. New columns do NOT
60
+ require bumping this version — only breaking schema changes (like the v1→v2 timezone
61
+ migration) do. Additive migrations live in `_apply_migrations()` only.
62
+
63
+ ---
64
+
65
+ ## 2. Current AI Detection
66
+
67
+ ### What exists today
68
+ The project currently detects AI involvement **only** for co-author attribution purposes
69
+ and for filtering out noise in classification — not for AI tool usage tracking.
70
+
71
+ **File**: `src/gitflow_analytics/utils/commit_utils.py`
72
+ - Function `extract_co_authors(message)` — extracts all `Co-authored-by: Name <email>` trailers
73
+ - Regex: `r"^Co-authored-by:\s*(.+?)\s*<([^>]+)>"` (MULTILINE | IGNORECASE)
74
+ - Returns `[{"name": ..., "email": ...}]`
75
+ - Used in `_analyze_commit()` to populate `commit_data["co_authors"]`
76
+
77
+ **File**: `src/gitflow_analytics/extractors/tickets.py` — function `filter_git_artifacts()`
78
+ - Strips `Co-authored-by:` lines generically (line 39)
79
+ - Has a **Copilot-specific** strip: `r"^Co-authored-by:.*[Cc]opilot.*$"` (line 57)
80
+ - Also strips `"suggestion from @?copilot"` in the `chore` category pattern (line 371)
81
+
82
+ **No existing code** maps co-author emails to specific AI tools (Claude Code, Cursor, Copilot).
83
+
84
+ ### Known AI tool co-author signatures
85
+ These are the email patterns emitted by each tool in `Co-authored-by:` trailers:
86
+ - **Claude Code**: `Co-authored-by: Claude <noreply@anthropic.com>` (or similar `@anthropic.com`)
87
+ - **GitHub Copilot**: `Co-authored-by: GitHub Copilot <copilot@github.com>` or `copilot[bot] <...>`
88
+ - **Cursor**: Does not emit co-author trailers — detection requires commit message heuristics
89
+
90
+ ---
91
+
92
+ ## 3. Commit Data Flow (raw git → `daily_metrics` row)
93
+
94
+ ### Step 1: Raw git commit → commit dict
95
+ **File**: `src/gitflow_analytics/core/analyzer_commit.py` — `CommitAnalyzerMixin._analyze_commit()`
96
+
97
+ Produces a dict with:
98
+ ```python
99
+ {
100
+ "hash": str,
101
+ "author_name": str,
102
+ "author_email": str,
103
+ "message": str,
104
+ "timestamp": datetime (UTC-aware),
105
+ "local_hour": int,
106
+ "is_merge": bool,
107
+ "branch": str,
108
+ "inferred_project": str,
109
+ "files_changed_count": int,
110
+ "files_changed": list[str], # file paths
111
+ "insertions": int, # raw (all files)
112
+ "deletions": int,
113
+ "filtered_insertions": int, # after exclusion list
114
+ "filtered_deletions": int,
115
+ "story_points": int|None,
116
+ "ticket_references": list[dict], # [{platform, id, full_id}]
117
+ "co_authors": list[dict], # [{name, email}]
118
+ "complexity_delta": float,
119
+ }
120
+ ```
121
+
122
+ Raw stats come from `git diff --numstat` (both `_calculate_raw_stats` and
123
+ `_calculate_filtered_stats` parse `insertions\tdeletions\tfilename` output).
124
+
125
+ ### Step 2: Commit dict → `cached_commits` row
126
+ **File**: `src/gitflow_analytics/core/cache.py` (and `cache_commits.py`)
127
+
128
+ Stores the commit dict into `CachedCommit` ORM. The `co_authors` field is NOT persisted
129
+ in `CachedCommit` — only: `commit_hash, repo_path, author_name, author_email, message,
130
+ timestamp, branch, is_merge, files_changed, insertions, deletions,
131
+ filtered_insertions, filtered_deletions, complexity_delta, story_points, ticket_references`.
132
+
133
+ ### Step 3: Commit list → `daily_metrics` rows
134
+ **File**: `src/gitflow_analytics/core/metrics_storage.py` — `DailyMetricsStorage.store_daily_metrics()`
135
+ - Calls `_aggregate_commits_by_day()` which groups by `(developer_id, project_key)` for a target date
136
+ - The category comes from `commit.get("category", "other")` — set by `TicketExtractor.categorize_commit()`
137
+ - Uses `filtered_insertions` / `filtered_deletions` for line counts
138
+ - **AI tool fields do not exist** in this aggregation yet
139
+
140
+ For Issue #21, the co_authors list needs to be preserved through the pipeline (either
141
+ stored in `CachedCommit` or re-derived from `message`) and then checked in
142
+ `_aggregate_commits_by_day()`.
143
+
144
+ ---
145
+
146
+ ## 4. Weekly Trends Rollup
147
+
148
+ ### `WeeklyTrends` ORM population
149
+ **File**: `src/gitflow_analytics/core/metrics_storage.py` — `DailyMetricsStorage.calculate_weekly_trends()`
150
+ - Queries `DailyMetrics` grouped by `func.strftime("%Y-%W", DailyMetrics.date)`
151
+ - Currently aggregates: `total_commits`, `feature_commits`, `bug_fix_commits`, `refactor_commits`
152
+ - Calculates week-over-week % change
153
+
154
+ **File**: `src/gitflow_analytics/reports/weekly_trends_writer.py` — `WeeklyTrendsWriter`
155
+ - Operates on raw commit lists (not the DB table) to produce CSV reports
156
+ - Groups by developer/project and Monday-anchored ISO week (`_get_week_start()`)
157
+ - Outputs per-category `{category}_count` and `{category}_pct_change` columns
158
+ - Does not read from `WeeklyTrends` table — it re-derives from commits directly
159
+
160
+ For Issue #22, the churn rate calculation (14-day rolling window) would fit in
161
+ `calculate_weekly_trends()` or as a separate method in `DailyMetricsStorage`.
162
+
163
+ ---
164
+
165
+ ## 5. CTO / Executive Report — AI Adoption Section
166
+
167
+ ### Current state
168
+ There is **no "§4 AI adoption" section** in any report file. Searching all report files
169
+ for "AI adoption", "ai_assisted", "ai_tool", "§4" returned zero matches.
170
+
171
+ The narrative report is generated by:
172
+ - **File**: `src/gitflow_analytics/reports/narrative_writer.py` — `NarrativeReportGenerator.generate_narrative_report()`
173
+ - Composed from mixins: `NarrativeExecutiveMixin`, `NarrativeClassificationMixin`,
174
+ `NarrativeTeamMixin`, `NarrativeAnalysisMixin`, `NarrativeRecommendationsMixin`
175
+
176
+ Sections currently produced:
177
+ 1. Executive Summary (`_write_executive_summary` in `narrative_executive.py`)
178
+ 2. Team Composition / Developer Profiles (`_write_team_composition` in `narrative_team.py`)
179
+ 3. Project Activity
180
+ 4. PR Analysis
181
+ 5. Recommendations
182
+
183
+ An "AI Adoption" section would be a new `_write_ai_adoption()` method, best added to
184
+ `narrative_analysis.py` or a new `narrative_ai.py` mixin.
185
+
186
+ The executive summary already writes Markdown bullet points like:
187
+ ```
188
+ - **Total Commits**: N
189
+ - **Ticket Coverage**: N%
190
+ ```
191
+ The AI section would follow the same pattern.
192
+
193
+ ---
194
+
195
+ ## 6. Key Extractor/Writer Files
196
+
197
+ ### `src/gitflow_analytics/extractors/tickets.py`
198
+ - Class `TicketExtractor(TicketAnalysisMixin)`
199
+ - `extract_from_text(text)` — returns `[{platform, id, full_id}]`
200
+ - `categorize_commit(message)` — returns category string, checked in priority order
201
+ - `filter_git_artifacts(message)` — strips co-author lines, Copilot lines, merge artifacts
202
+ - `should_skip_commit(commit)` — respects `commit_filter` config
203
+ - Inherits `analyze_ticket_coverage()` from `TicketAnalysisMixin`
204
+
205
+ ### `src/gitflow_analytics/extractors/tickets_analysis.py`
206
+ - Class `TicketAnalysisMixin`
207
+ - `analyze_ticket_coverage(commits, prs)` — main coverage analysis entry point
208
+ - Filters excluded repos and excluded authors
209
+ - Produces `untracked_commits` list with `category` field set
210
+
211
+ ### `src/gitflow_analytics/reports/weekly_trends_writer.py`
212
+ - Class `WeeklyTrendsWriter`
213
+ - `generate_weekly_trends_reports(commits, output_dir, weeks, ...)` — main entry point
214
+ - `_generate_developer_weekly_trends()` — per-developer CSV
215
+ - `_generate_project_weekly_trends()` — per-project CSV
216
+ - `_get_commit_classification(commit, categorize_fn)` — priority: `predicted_class` > `category` > `classification` > `categorize_fn` > `"other"`
217
+ - Uses Monday-aligned ISO weeks (`_get_week_start()`)
218
+ - All 20 classification categories listed in `self.classification_categories`
219
+
220
+ ---
221
+
222
+ ## 7. Test Patterns
223
+
224
+ ### Schema migration tests
225
+ Pattern from `tests/models/test_pull_request_cache_v4.py`:
226
+ ```python
227
+ class TestMigrationAppliesV4Columns:
228
+ def _create_v3_db(self, db_path):
229
+ # Create table with old schema via raw SQL
230
+ engine = create_engine(f"sqlite:///{db_path}")
231
+ with engine.connect() as conn:
232
+ conn.execute(text("CREATE TABLE ... (old columns only)"))
233
+ conn.execute(text("INSERT INTO ... (legacy row)"))
234
+ conn.commit()
235
+
236
+ def test_migration_adds_all_v4_columns(self, tmp_path):
237
+ cache_dir = tmp_path / ".gitflow-cache"
238
+ cache_dir.mkdir()
239
+ self._create_v3_db(cache_dir / "gitflow_cache.db")
240
+ cache = GitAnalysisCache(cache_dir, ttl_hours=24) # triggers migration
241
+ with cache.db.engine.connect() as conn:
242
+ result = conn.execute(text("PRAGMA table_info(pull_request_cache)"))
243
+ actual_columns = {row[1] for row in result}
244
+ assert "new_column" in actual_columns
245
+
246
+ def test_migration_preserves_existing_rows(self, tmp_path): ...
247
+ def test_migration_idempotent(self, tmp_path): ...
248
+ ```
249
+
250
+ For Issues #21/#22, follow this pattern with `daily_metrics` and `weekly_trends` tables.
251
+
252
+ ### AI detection / classification tests
253
+ Pattern from `tests/extractors/test_commit_categorization.py` and
254
+ `tests/test_classification_system.py`:
255
+ - Use `TicketExtractor().categorize_commit(message)` directly
256
+ - Assert returned category string
257
+
258
+ For Issue #21, tests would assert:
259
+ ```python
260
+ def test_detects_claude_code_coauthor():
261
+ commit = {"message": "feat: add feature\n\nCo-authored-by: Claude <noreply@anthropic.com>"}
262
+ result = detect_ai_tool(commit)
263
+ assert result["claude_code"] == True
264
+
265
+ def test_detects_copilot_coauthor():
266
+ commit = {"message": "fix: bug\n\nCo-authored-by: GitHub Copilot <copilot@github.com>"}
267
+ result = detect_ai_tool(commit)
268
+ assert result["copilot"] == True
269
+ ```
270
+
271
+ ---
272
+
273
+ ## 8. Existing Churn-Related Code
274
+
275
+ **No code churn tracking exists.** The closest things:
276
+ - `lines_added` / `lines_deleted` in `DailyMetrics` — raw additions/deletions per developer per day
277
+ - `filtered_insertions` / `filtered_deletions` in `CachedCommit` — after exclude_paths filtering
278
+ - `revision_count` in `PullRequestCache` — commits pushed after PR opened (PR-level rework, not code churn)
279
+ - `metrics/activity_scoring.py` docstring mentions "Code churn (deletions valued for refactoring)" but there is no churn rate calculation anywhere
280
+
281
+ **For Issue #22**, code churn rate over 14 days would be calculated as:
282
+ ```
283
+ churn_rate = sum(deletions over 14 days) / sum(insertions over 14 days)
284
+ ```
285
+ or alternatively:
286
+ ```
287
+ churn_lines = sum(deletions) (lines removed = old code replaced)
288
+ churn_rate = churn_lines / total_lines_changed
289
+ ```
290
+ Data source: query `DailyMetrics` with `date >= today - 14 days`, aggregate
291
+ `lines_added` and `lines_deleted` per developer.
292
+
293
+ ---
294
+
295
+ ## Implementation Recommendations
296
+
297
+ ### Issue #21: Per-developer AI tool tracking
298
+
299
+ 1. **Detection function** (new file or add to `commit_utils.py`):
300
+ - Parse `co_authors` list for known AI tool email patterns
301
+ - Claude Code: email contains `anthropic.com`
302
+ - Copilot: email contains `copilot@github.com` or name matches `copilot[bot]`
303
+ - Cursor: heuristic on commit message (no standard co-author trailer exists)
304
+
305
+ 2. **Preserve co_authors through pipeline**:
306
+ - Option A: Add `co_authors` JSON column to `CachedCommit`
307
+ - Option B: Re-parse from `message` field in `_aggregate_commits_by_day()`
308
+ - Option B is simpler (message is already stored)
309
+
310
+ 3. **New columns in `daily_metrics`** (add via `_apply_migrations()`):
311
+ - `ai_assisted_commits INTEGER DEFAULT 0`
312
+ - `claude_code_commits INTEGER DEFAULT 0`
313
+ - `cursor_commits INTEGER DEFAULT 0`
314
+ - `copilot_commits INTEGER DEFAULT 0`
315
+
316
+ 4. **Update `_aggregate_commits_by_day()`** in `metrics_storage.py` to count AI tool usage
317
+
318
+ 5. **New `_write_ai_adoption()` method** in `narrative_analysis.py` or new `narrative_ai.py`
319
+
320
+ ### Issue #22: 14-day code churn rate
321
+
322
+ 1. **No new DB columns needed** for the metric itself — it is derived from existing
323
+ `lines_added` / `lines_deleted` in `DailyMetrics`
324
+
325
+ 2. **New method** in `DailyMetricsStorage`:
326
+ ```python
327
+ def calculate_churn_rate(self, developer_id, end_date, days=14) -> float:
328
+ # Query daily_metrics for the 14-day window
329
+ # Return deletions / (additions + deletions) or similar
330
+ ```
331
+
332
+ 3. **Optional**: Add `churn_rate_14d REAL` to `WeeklyTrends` for precomputed reporting
333
+
334
+ 4. **Report integration**: Add to developer profile section in `narrative_team.py`
335
+ and to developer CSV in `csv_reports_developer.py`
@@ -1,4 +1,4 @@
1
1
  """Version information for gitflow-analytics."""
2
2
 
3
- __version__ = "3.13.24"
3
+ __version__ = "3.13.26"
4
4
  __version_info__ = tuple(int(x) for x in __version__.split("."))
@@ -103,7 +103,7 @@ def cli(ctx: click.Context) -> None:
103
103
  # Register commands from sub-modules
104
104
  # ---------------------------------------------------------------------------
105
105
 
106
- from .cli_analysis import analyze_subcommand, register_analysis_commands # noqa: E402
106
+ from .cli_analysis import register_analysis_commands # noqa: E402
107
107
  from .cli_setup import register_setup_commands # noqa: E402
108
108
  from .cli_training import register_training_commands # noqa: E402
109
109
 
@@ -113,12 +113,6 @@ register_training_commands(cli)
113
113
 
114
114
  # Identity / alias commands from dedicated module
115
115
  from .cli_identity import ( # noqa: E402
116
- alias_rename,
117
- aliases_command,
118
- create_alias_interactive,
119
- identities,
120
- list_developers,
121
- merge_identity,
122
116
  register_identity_commands,
123
117
  )
124
118
 
@@ -6,7 +6,7 @@ import logging
6
6
  from dataclasses import dataclass, field
7
7
  from datetime import datetime
8
8
  from pathlib import Path
9
- from typing import Any, Optional
9
+ from typing import Any
10
10
 
11
11
  import click
12
12
 
@@ -8,11 +8,10 @@ cli_analysis_helpers.
8
8
  import logging
9
9
  import sys
10
10
  from pathlib import Path
11
- from typing import Any, Optional
11
+ from typing import Optional
12
12
 
13
13
  import click
14
14
 
15
- from ._version import __version__
16
15
  from .cli_formatting import ImprovedErrorHandler
17
16
  from .cli_utils import setup_logging
18
17
  from .config.errors import ConfigurationError
@@ -52,25 +51,22 @@ def analyze(
52
51
 
53
52
  # Lazy imports: Only load heavy dependencies when actually running analysis
54
53
  # This improves CLI startup time from ~2s to <100ms for commands like --help
55
- from .core.analyzer import GitAnalyzer
56
- from .core.cache import GitAnalysisCache
57
- from .core.identity import DeveloperIdentityResolver
58
- from .core.progress import get_progress_service
59
-
60
54
  # Pipeline stage functions (extracted from this function)
61
55
  from .core.analyze_pipeline import (
62
- ClassificationResult,
63
- CommitLoadResult,
64
56
  QualitativeResult,
57
+ aggregate_pm_data,
65
58
  analyze_tickets_and_store_metrics,
66
59
  calculate_date_range,
67
60
  discover_repositories,
68
61
  generate_all_reports,
69
62
  load_and_validate_config,
70
63
  run_qualitative_analysis,
71
- aggregate_pm_data,
72
64
  )
73
65
  from .core.analyze_pipeline_helpers import get_qualitative_config, is_qualitative_enabled
66
+ from .core.analyzer import GitAnalyzer
67
+ from .core.cache import GitAnalysisCache
68
+ from .core.identity import DeveloperIdentityResolver
69
+ from .core.progress import get_progress_service
74
70
 
75
71
  try:
76
72
  from ._version import __version__
@@ -9,7 +9,6 @@ from typing import Optional
9
9
  import click
10
10
 
11
11
  from ._version import __version__
12
- from .cli_formatting import handle_timezone_error
13
12
  from .cli_utils import setup_logging
14
13
  from .config import ConfigLoader
15
14
  from .ui.progress_display import create_progress_display
@@ -10,14 +10,12 @@ Method groups extracted to sibling modules via mixins:
10
10
  """
11
11
 
12
12
  import logging
13
- import os
14
13
  import re
15
14
  import sys
16
15
  from pathlib import Path
17
16
  from typing import Optional
18
17
 
19
18
  import click
20
- import yaml
21
19
  from github import Github
22
20
  from github.GithubException import GithubException
23
21
 
@@ -502,7 +500,6 @@ class InstallWizard(InstallWizardOutputMixin, InstallWizardPMMixin, InstallWizar
502
500
  Returns:
503
501
  Normalized Git URL if detected, None if it's a local path
504
502
  """
505
- import re
506
503
 
507
504
  # HTTPS URL patterns
508
505
  https_pattern = r"^https?://[^/]+/[^/]+/[^/]+(?:\.git)?$"
@@ -10,11 +10,9 @@ import logging
10
10
  import os
11
11
  import stat
12
12
  import subprocess
13
- import sys
14
13
  import time
15
14
  from datetime import datetime
16
15
  from pathlib import Path
17
- from typing import Optional
18
16
 
19
17
  import click
20
18
  import requests
@@ -7,12 +7,10 @@ Methods: _setup_jira, _setup_linear, _validate_linear, _setup_clickup,
7
7
  """
8
8
 
9
9
  import logging
10
- import os
11
10
  from typing import Optional
12
11
 
13
12
  import click
14
13
  import requests
15
- import yaml
16
14
 
17
15
  logger = logging.getLogger(__name__)
18
16
 
@@ -7,9 +7,6 @@ Methods: _clone_git_repository, _normalize_git_url, _get_git_progress,
7
7
 
8
8
  import logging
9
9
  import shutil
10
- import stat
11
- import subprocess
12
- import time
13
10
  from pathlib import Path
14
11
  from typing import Optional
15
12
 
@@ -741,6 +741,7 @@ class ConfigLoader(ConfigLoaderSectionsMixin):
741
741
  patterns=dict(_td_raw.get("patterns", _td_defaults.patterns)),
742
742
  exclude_patterns=list(_td_raw.get("exclude_patterns", _td_defaults.exclude_patterns)),
743
743
  exclude_repos=list(_td_raw.get("exclude_repos", _td_defaults.exclude_repos)),
744
+ exclude_authors=list(_td_raw.get("exclude_authors", _td_defaults.exclude_authors)),
744
745
  )
745
746
 
746
747
  return AnalysisConfig(
@@ -362,6 +362,8 @@ class TicketDetectionConfig:
362
362
  - "\\d{8,}"
363
363
  exclude_repos:
364
364
  - "APEX" # knowledge base — exclude from ticket compliance
365
+ exclude_authors:
366
+ - "Bob Matsuoka" # CTO — tooling/analysis, different workflow
365
367
  """
366
368
 
367
369
  # Which commits to scan.
@@ -406,6 +408,15 @@ class TicketDetectionConfig:
406
408
  # documentation repos where JIRA tickets are not expected.
407
409
  exclude_repos: list[str] = field(default_factory=list)
408
410
 
411
+ # Author names to exclude from ticket compliance metrics.
412
+ # Commits from these authors are still included in activity reporting
413
+ # but are excluded from ticket coverage rate calculations. Useful for
414
+ # CTO/leadership roles doing tooling/analysis work where JIRA tickets
415
+ # are not expected. Matching is case-insensitive substring against
416
+ # the commit's author_name (so "Bob Matsuoka" matches
417
+ # "Bob Matsuoka via Claude").
418
+ exclude_authors: list[str] = field(default_factory=list)
419
+
409
420
 
410
421
  @dataclass
411
422
  class AnalysisConfig:
@@ -1,21 +1,13 @@
1
1
  """Git repository analyzer with batch processing support."""
2
2
 
3
3
  import logging
4
- import re
5
- from collections.abc import Generator
6
- from datetime import datetime, timedelta, timezone
4
+ from datetime import datetime
7
5
  from pathlib import Path
8
6
  from typing import Any, Optional
9
7
 
10
- import git
11
8
  from git import Repo
12
9
 
13
- from ..types import FilteredCommitStats
14
- from ..utils.commit_utils import extract_co_authors, is_merge_commit
15
10
  from ..utils.debug import is_debug_mode
16
- from ..utils.glob_matcher import match_recursive_pattern as _match_recursive_pattern_fn
17
- from ..utils.glob_matcher import matches_glob_pattern as _matches_glob_pattern_fn
18
- from ..utils.glob_matcher import should_exclude_file as _should_exclude_file_fn
19
11
  from .analysis_components import (
20
12
  build_branch_mapper,
21
13
  build_story_point_extractor,
@@ -29,8 +21,8 @@ logger = logging.getLogger(__name__)
29
21
 
30
22
 
31
23
 
32
- from .analyzer_git import GitAnalyzerMixin
33
24
  from .analyzer_commit import CommitAnalyzerMixin
25
+ from .analyzer_git import GitAnalyzerMixin
34
26
 
35
27
 
36
28
  class GitAnalyzer(GitAnalyzerMixin, CommitAnalyzerMixin):
@@ -3,28 +3,18 @@
3
3
  """Git repository analyzer with batch processing support."""
4
4
 
5
5
  import logging
6
- import re
7
- from collections.abc import Generator
8
- from datetime import datetime, timedelta, timezone
6
+ from datetime import timezone
9
7
  from pathlib import Path
10
- from typing import Any, Optional
8
+ from typing import Any
11
9
 
12
10
  import git
13
11
  from git import Repo
14
12
 
15
13
  from ..types import FilteredCommitStats
16
14
  from ..utils.commit_utils import extract_co_authors, is_merge_commit
17
- from ..utils.debug import is_debug_mode
18
15
  from ..utils.glob_matcher import match_recursive_pattern as _match_recursive_pattern_fn
19
16
  from ..utils.glob_matcher import matches_glob_pattern as _matches_glob_pattern_fn
20
17
  from ..utils.glob_matcher import should_exclude_file as _should_exclude_file_fn
21
- from .analysis_components import (
22
- build_branch_mapper,
23
- build_story_point_extractor,
24
- build_ticket_extractor,
25
- )
26
- from .cache import GitAnalysisCache
27
- from .progress import get_progress_service
28
18
 
29
19
  # Get logger for this module
30
20
  logger = logging.getLogger(__name__)
@@ -43,7 +33,6 @@ class CommitAnalyzerMixin:
43
33
  )
44
34
 
45
35
  # Ensure timezone-aware timestamp in UTC
46
- from datetime import timezone
47
36
 
48
37
  if commit_timestamp.tzinfo is None:
49
38
  # Convert naive datetime to UTC
@@ -12,18 +12,6 @@ from typing import Any, Optional
12
12
  import git
13
13
  from git import Repo
14
14
 
15
- from ..types import FilteredCommitStats
16
- from ..utils.commit_utils import extract_co_authors, is_merge_commit
17
- from ..utils.debug import is_debug_mode
18
- from ..utils.glob_matcher import match_recursive_pattern as _match_recursive_pattern_fn
19
- from ..utils.glob_matcher import matches_glob_pattern as _matches_glob_pattern_fn
20
- from ..utils.glob_matcher import should_exclude_file as _should_exclude_file_fn
21
- from .analysis_components import (
22
- build_branch_mapper,
23
- build_story_point_extractor,
24
- build_ticket_extractor,
25
- )
26
- from .cache import GitAnalysisCache
27
15
  from .progress import get_progress_service
28
16
 
29
17
  # Get logger for this module
@@ -3,25 +3,16 @@
3
3
  import hashlib
4
4
  import json
5
5
  import logging
6
- from contextlib import contextmanager
7
6
  from datetime import datetime, timedelta, timezone
8
- from pathlib import Path
9
- from typing import Any, Optional, Union
7
+ from typing import Any, Optional
10
8
 
11
- import git
12
9
  from sqlalchemy import and_
13
10
 
14
- from ..constants import BatchSizes, CacheTTL, Thresholds
15
11
  from ..models.database import (
16
12
  CachedCommit,
17
- Database,
18
- IssueCache,
19
- PullRequestCache,
20
13
  RepositoryAnalysisStatus,
21
14
  WeeklyFetchStatus,
22
15
  )
23
- from ..utils.commit_utils import extract_co_authors as _extract_co_authors_from_message
24
- from ..utils.debug import is_debug_mode
25
16
 
26
17
  logger = logging.getLogger(__name__)
27
18