gitflow-analytics 3.13.22__tar.gz → 3.13.24__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 (402) hide show
  1. {gitflow_analytics-3.13.22/src/gitflow_analytics.egg-info → gitflow_analytics-3.13.24}/PKG-INFO +1 -1
  2. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/_version.py +1 -1
  3. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/config/loader.py +1 -0
  4. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/config/schema.py +9 -0
  5. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/extractors/tickets.py +57 -24
  6. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/extractors/tickets_analysis.py +30 -4
  7. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24/src/gitflow_analytics.egg-info}/PKG-INFO +1 -1
  8. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics.egg-info/SOURCES.txt +1 -0
  9. gitflow_analytics-3.13.24/tests/extractors/test_commit_categorization.py +243 -0
  10. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/CHANGELOG.md +0 -0
  11. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/CLAUDE.md +0 -0
  12. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/LICENSE +0 -0
  13. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/MANIFEST.in +0 -0
  14. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/README.md +0 -0
  15. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/DOCUMENTATION-STANDARDS.md +0 -0
  16. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/README.md +0 -0
  17. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/SECURITY.md +0 -0
  18. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/STRUCTURE.md +0 -0
  19. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/README.md +0 -0
  20. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/analysis-files/ewtn-critical-security-report.md +0 -0
  21. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_engineer_20250915_085239_236.md +0 -0
  22. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_engineer_20250915_114233_697.md +0 -0
  23. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_engineer_20250915_115330_511.md +0 -0
  24. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_engineer_20250915_120516_669.md +0 -0
  25. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_engineer_20250915_124906_951.md +0 -0
  26. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_engineer_20250915_175540_671.md +0 -0
  27. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_engineer_20250915_214023_300.md +0 -0
  28. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_engineer_20250916_130622_510.md +0 -0
  29. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_ops_20250915_123323_419.md +0 -0
  30. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_ops_20250915_134446_128.md +0 -0
  31. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_ops_20250915_184656_725.md +0 -0
  32. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_research_20250915_091233_023.md +0 -0
  33. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_research_20250915_100404_339.md +0 -0
  34. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/agent_research_20250915_110606_413.md +0 -0
  35. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/system_prompt_20250915_084833_641.md +0 -0
  36. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/system_prompt_20250915_090830_660.md +0 -0
  37. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-logs/prompts/system_prompt_20250916_130545_822.md +0 -0
  38. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-reports/output/database_qualitative_report_20250630_20250824.md +0 -0
  39. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-reports/output/narrative_report_20250630_20250824.md +0 -0
  40. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-reports/reports-24week/database_qualitative_report_20250303_20250817.md +0 -0
  41. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-reports/reports-24week/narrative_report_20250303_20250817.md +0 -0
  42. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-reports/test-ewtn-reports/narrative_report_20250810.md +0 -0
  43. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-reports/test-reports/database_qualitative_report_20250908_20250914.md +0 -0
  44. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-reports/test-reports/narrative_report_20250908_20250914.md +0 -0
  45. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-reports/test-weekly-reports/database_qualitative_report_20250623_20250817.md +0 -0
  46. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/old-reports/test-weekly-reports/narrative_report_20250623_20250817.md +0 -0
  47. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/CHANGELOG_INTERACTIVE_LAUNCHER.md +0 -0
  48. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/CLEANUP_SUMMARY-20250929.md +0 -0
  49. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/FEATURES_READY_FOR_TESTING.md +0 -0
  50. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/FIX_SUMMARY.md +0 -0
  51. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/IMPLEMENTATION_SUMMARY.md +0 -0
  52. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/PROGRESS_TRACKING_FIXES.md +0 -0
  53. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/PROJECT_CLEANUP_REPORT-20250929.md +0 -0
  54. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/README.md +0 -0
  55. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/STORY_POINTS_CONFIG_SUMMARY-archived.md +0 -0
  56. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/SYNTAX_ERROR_FIX.md +0 -0
  57. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/TEST_REPORT_GIT_CLONING.md +0 -0
  58. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/TIMEZONE_BUG_RESOLUTION.md +0 -0
  59. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/USAGE_EXAMPLES-archived.md +0 -0
  60. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/_archive/temp-files/code_analysis_report.md +0 -0
  61. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/architecture/README.md +0 -0
  62. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/architecture/branch-analysis-optimization.md +0 -0
  63. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/architecture/caching-strategy.md +0 -0
  64. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/architecture/llm-classifier-refactoring.md +0 -0
  65. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/architecture/ml-pipeline.md +0 -0
  66. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/cicd-integration-implementation-summary.md +0 -0
  67. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/configuration/configuration.md +0 -0
  68. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/deployment/README.md +0 -0
  69. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/design/README.md +0 -0
  70. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/design/circuit-breaker-implementation.md +0 -0
  71. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/design/commit-classification-design.md +0 -0
  72. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/design/git_pm_correlation_design.md +0 -0
  73. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/design/platform-agnostic-pm-framework.md +0 -0
  74. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/design/qualitative_data_extraction.md +0 -0
  75. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/developer/README.md +0 -0
  76. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/developer/contributing.md +0 -0
  77. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/developer/development-setup.md +0 -0
  78. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/developer/project-organization.md +0 -0
  79. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/developer/refactoring-guide.md +0 -0
  80. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/developer/training-guide.md +0 -0
  81. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/examples/README.md +0 -0
  82. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/examples/interactive-launcher-examples.md +0 -0
  83. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/examples/story-points-configuration.md +0 -0
  84. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/getting-started/README.md +0 -0
  85. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/getting-started/first-analysis.md +0 -0
  86. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/getting-started/installation.md +0 -0
  87. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/getting-started/quickstart.md +0 -0
  88. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/guides/LLM_CLASSIFICATION_GUIDE.md +0 -0
  89. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/guides/README.md +0 -0
  90. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/guides/chatgpt-setup.md +0 -0
  91. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/guides/identity-resolution-enhanced.md +0 -0
  92. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/guides/interactive-launcher.md +0 -0
  93. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/guides/managing-aliases.md +0 -0
  94. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/guides/ml-categorization.md +0 -0
  95. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/guides/pm-platform-setup.md +0 -0
  96. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/guides/troubleshooting.md +0 -0
  97. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/managers/README.md +0 -0
  98. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/managers/dashboard-guide.md +0 -0
  99. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/managers/faq.md +0 -0
  100. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/managers/interpreting-reports.md +0 -0
  101. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/managers/metrics-reference.md +0 -0
  102. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/managers/quickstart.md +0 -0
  103. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/quick-reference/launcher-and-identity.md +0 -0
  104. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/reference/README.md +0 -0
  105. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/reference/cache-system.md +0 -0
  106. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/reference/cli-commands.md +0 -0
  107. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/reference/configuration-schema.md +0 -0
  108. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/reference/json-export-schema.md +0 -0
  109. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/bedrock-classify-fallback-debug-2026-02-26.md +0 -0
  110. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/bedrock-llm-not-called-2026-02-27.md +0 -0
  111. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/bug-investigation-issues-2-3-4-2026-02-03.md +0 -0
  112. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/cache-missing-repos-investigation-2026-02-27.md +0 -0
  113. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/cicd-integration-patterns-2025-02-09.md +0 -0
  114. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/classify-pipeline-reclassify-feature-2026-02-26.md +0 -0
  115. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/cli-refactoring-plan-2026-02-26.md +0 -0
  116. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/code-review-low-hanging-fruit-2026-02-25.md +0 -0
  117. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/commit-classification-complexity-field-2026-02-27.md +0 -0
  118. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/commit-classification-verification-2026-02-26.md +0 -0
  119. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/csv-generation-narrative-bug-20251222.md +0 -0
  120. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/data-fetching-architecture-2026-02-26.md +0 -0
  121. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/github-auth-requirement-investigation-2026-02-25.md +0 -0
  122. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/identity-alias-system-2026-02-26.md +0 -0
  123. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/identity-resolution-architecture-2026-02-27.md +0 -0
  124. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/manager-onboarding-documentation-analysis-2026-02-03.md +0 -0
  125. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/memory-leak-analysis-2026-02-26.md +0 -0
  126. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/narrative-report-developer-names-2026-02-27.md +0 -0
  127. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/pipeline-data-points-audit-2026-02-27.md +0 -0
  128. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/pr-data-model-and-status-tracking-2026-02-26.md +0 -0
  129. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/pr-fetching-report-vs-analyze-2026-02-27.md +0 -0
  130. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/pr-tracking-and-alias-gap-analysis-2026-02-25.md +0 -0
  131. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/pr-tracking-capabilities-analysis-2026-02-25.md +0 -0
  132. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/qa-report-2026-02-16-week.md +0 -0
  133. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/test-cli-memory-leak-root-cause-2026-02-26.md +0 -0
  134. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/docs/research/week-segmentation-bug-investigation-2026-02-25.md +0 -0
  135. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/pyproject.toml +0 -0
  136. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/setup.cfg +0 -0
  137. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/__init__.py +0 -0
  138. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/classification/__init__.py +0 -0
  139. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/classification/batch_classifier.py +0 -0
  140. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/classification/batch_classifier_impl.py +0 -0
  141. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/classification/classifier.py +0 -0
  142. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/classification/feature_extractor.py +0 -0
  143. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/classification/linguist_analyzer.py +0 -0
  144. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/classification/model.py +0 -0
  145. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli.py +0 -0
  146. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_analysis.py +0 -0
  147. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_analysis_helpers.py +0 -0
  148. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_analysis_modes.py +0 -0
  149. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_analysis_orchestrator.py +0 -0
  150. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_fetch.py +0 -0
  151. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_formatting.py +0 -0
  152. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_identity.py +0 -0
  153. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_identity_alias_ops.py +0 -0
  154. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_identity_commands.py +0 -0
  155. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_pipeline_commands.py +0 -0
  156. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_setup.py +0 -0
  157. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_training.py +0 -0
  158. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_utils.py +0 -0
  159. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_wizards/__init__.py +0 -0
  160. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_wizards/install_wizard.py +0 -0
  161. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_wizards/install_wizard_output.py +0 -0
  162. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_wizards/install_wizard_pm.py +0 -0
  163. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_wizards/install_wizard_repos.py +0 -0
  164. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_wizards/menu.py +0 -0
  165. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/cli_wizards/run_launcher.py +0 -0
  166. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/config/__init__.py +0 -0
  167. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/config/aliases.py +0 -0
  168. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/config/errors.py +0 -0
  169. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/config/loader_sections.py +0 -0
  170. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/config/profiles.py +0 -0
  171. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/config/repository.py +0 -0
  172. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/config/validator.py +0 -0
  173. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/config.py +0 -0
  174. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/constants.py +0 -0
  175. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/__init__.py +0 -0
  176. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/analysis_components.py +0 -0
  177. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/analyze_pipeline.py +0 -0
  178. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/analyze_pipeline_helpers.py +0 -0
  179. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/analyze_pipeline_reports.py +0 -0
  180. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/analyzer.py +0 -0
  181. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/analyzer_commit.py +0 -0
  182. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/analyzer_git.py +0 -0
  183. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/branch_mapper.py +0 -0
  184. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/cache.py +0 -0
  185. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/cache_commits.py +0 -0
  186. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/cache_weekly.py +0 -0
  187. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/data_fetcher.py +0 -0
  188. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/data_fetcher_git.py +0 -0
  189. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/data_fetcher_parallel.py +0 -0
  190. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/data_fetcher_processing.py +0 -0
  191. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/git_auth.py +0 -0
  192. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/git_timeout_wrapper.py +0 -0
  193. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/identity.py +0 -0
  194. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/identity_stats.py +0 -0
  195. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/metrics_storage.py +0 -0
  196. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/progress.py +0 -0
  197. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/repo_cloner.py +0 -0
  198. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/schema_version.py +0 -0
  199. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/core/subprocess_git.py +0 -0
  200. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/extractors/__init__.py +0 -0
  201. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/extractors/base.py +0 -0
  202. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/extractors/ml_prediction_cache.py +0 -0
  203. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/extractors/ml_tickets.py +0 -0
  204. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/extractors/ml_tickets_analysis.py +0 -0
  205. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/extractors/story_points.py +0 -0
  206. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/identity_llm/__init__.py +0 -0
  207. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/identity_llm/analysis_pass.py +0 -0
  208. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/identity_llm/analyzer.py +0 -0
  209. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/identity_llm/models.py +0 -0
  210. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/integrations/__init__.py +0 -0
  211. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/integrations/cicd/__init__.py +0 -0
  212. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/integrations/cicd/base.py +0 -0
  213. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/integrations/cicd/github_actions.py +0 -0
  214. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/integrations/github_integration.py +0 -0
  215. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/integrations/jira_integration.py +0 -0
  216. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/integrations/orchestrator.py +0 -0
  217. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/metrics/__init__.py +0 -0
  218. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/metrics/activity_scoring.py +0 -0
  219. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/metrics/branch_health.py +0 -0
  220. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/metrics/dora.py +0 -0
  221. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/models/__init__.py +0 -0
  222. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/models/database.py +0 -0
  223. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/models/database_base.py +0 -0
  224. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/models/database_commit_models.py +0 -0
  225. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/models/database_identity_models.py +0 -0
  226. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/models/database_metrics_models.py +0 -0
  227. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pipeline.py +0 -0
  228. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pipeline_classify.py +0 -0
  229. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pipeline_collect.py +0 -0
  230. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pipeline_report.py +0 -0
  231. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pipeline_types.py +0 -0
  232. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pm_framework/__init__.py +0 -0
  233. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pm_framework/adapters/__init__.py +0 -0
  234. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pm_framework/adapters/jira_adapter.py +0 -0
  235. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pm_framework/adapters/jira_adapter_converters.py +0 -0
  236. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pm_framework/adapters/jira_cache.py +0 -0
  237. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pm_framework/base.py +0 -0
  238. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pm_framework/models.py +0 -0
  239. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pm_framework/orchestrator.py +0 -0
  240. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/pm_framework/registry.py +0 -0
  241. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/__init__.py +0 -0
  242. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/chatgpt_analyzer.py +0 -0
  243. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/__init__.py +0 -0
  244. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/change_type.py +0 -0
  245. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/domain_classifier.py +0 -0
  246. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/intent_analyzer.py +0 -0
  247. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/llm/__init__.py +0 -0
  248. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/llm/base.py +0 -0
  249. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/llm/batch_processor.py +0 -0
  250. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/llm/bedrock_client.py +0 -0
  251. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/llm/cache.py +0 -0
  252. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/llm/cost_tracker.py +0 -0
  253. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/llm/openai_client.py +0 -0
  254. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/llm/prompts.py +0 -0
  255. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/llm/response_parser.py +0 -0
  256. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/llm_commit_classifier.py +0 -0
  257. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/classifiers/risk_analyzer.py +0 -0
  258. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/core/__init__.py +0 -0
  259. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/core/llm_fallback.py +0 -0
  260. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/core/nlp_engine.py +0 -0
  261. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/core/pattern_cache.py +0 -0
  262. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/core/processor.py +0 -0
  263. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/enhanced_analyzer.py +0 -0
  264. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/enhanced_analyzer_developer.py +0 -0
  265. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/enhanced_analyzer_executive.py +0 -0
  266. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/enhanced_analyzer_projects.py +0 -0
  267. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/enhanced_analyzer_workflow.py +0 -0
  268. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/example_enhanced_usage.py +0 -0
  269. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/models/__init__.py +0 -0
  270. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/models/schemas.py +0 -0
  271. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/utils/__init__.py +0 -0
  272. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/utils/batch_processor.py +0 -0
  273. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/utils/cost_tracker.py +0 -0
  274. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/utils/metrics.py +0 -0
  275. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/qualitative/utils/text_processing.py +0 -0
  276. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/__init__.py +0 -0
  277. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/analytics_patterns.py +0 -0
  278. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/analytics_writer.py +0 -0
  279. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/base.py +0 -0
  280. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/branch_health_writer.py +0 -0
  281. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/classification_csv.py +0 -0
  282. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/classification_writer.py +0 -0
  283. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/cli_integration.py +0 -0
  284. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/csv_reports_developer.py +0 -0
  285. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/csv_reports_dora.py +0 -0
  286. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/csv_reports_weekly.py +0 -0
  287. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/csv_writer.py +0 -0
  288. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/data_models.py +0 -0
  289. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/database_report_generator.py +0 -0
  290. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/example_usage.py +0 -0
  291. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/factory.py +0 -0
  292. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/formatters.py +0 -0
  293. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/html_generator.py +0 -0
  294. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/html_sections.py +0 -0
  295. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/interfaces.py +0 -0
  296. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/json_export_builders.py +0 -0
  297. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/json_export_developer.py +0 -0
  298. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/json_export_executive.py +0 -0
  299. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/json_export_insights.py +0 -0
  300. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/json_export_utils.py +0 -0
  301. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/json_exporter.py +0 -0
  302. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/narrative_analysis.py +0 -0
  303. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/narrative_classification.py +0 -0
  304. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/narrative_executive.py +0 -0
  305. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/narrative_recommendations.py +0 -0
  306. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/narrative_team.py +0 -0
  307. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/narrative_writer.py +0 -0
  308. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/story_point_correlation.py +0 -0
  309. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/story_point_helpers.py +0 -0
  310. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/reports/weekly_trends_writer.py +0 -0
  311. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/security/__init__.py +0 -0
  312. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/security/config.py +0 -0
  313. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/security/extractors/__init__.py +0 -0
  314. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/security/extractors/dependency_checker.py +0 -0
  315. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/security/extractors/secret_detector.py +0 -0
  316. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/security/extractors/vulnerability_scanner.py +0 -0
  317. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/security/llm_analyzer.py +0 -0
  318. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/security/reports/__init__.py +0 -0
  319. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/security/reports/security_report.py +0 -0
  320. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/security/security_analyzer.py +0 -0
  321. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/training/__init__.py +0 -0
  322. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/training/model_loader.py +0 -0
  323. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/training/pipeline.py +0 -0
  324. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/types/__init__.py +0 -0
  325. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/types/commit_types.py +0 -0
  326. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/ui/__init__.py +0 -0
  327. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/ui/progress_display.py +0 -0
  328. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/ui/progress_display_rich.py +0 -0
  329. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/ui/progress_display_rich_render.py +0 -0
  330. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/utils/__init__.py +0 -0
  331. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/utils/commit_utils.py +0 -0
  332. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/utils/date_utils.py +0 -0
  333. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/utils/debug.py +0 -0
  334. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/utils/glob_matcher.py +0 -0
  335. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics/verify_activity.py +0 -0
  336. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics.egg-info/dependency_links.txt +0 -0
  337. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics.egg-info/entry_points.txt +0 -0
  338. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics.egg-info/requires.txt +0 -0
  339. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/src/gitflow_analytics.egg-info/top_level.txt +0 -0
  340. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/__init__.py +0 -0
  341. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/conftest.py +0 -0
  342. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/core/__init__.py +0 -0
  343. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/core/test_analyzer.py +0 -0
  344. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/core/test_analyzer_merge_stats.py +0 -0
  345. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/core/test_cache.py +0 -0
  346. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/core/test_data_fetcher.py +0 -0
  347. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/core/test_data_fetcher_merge_stats.py +0 -0
  348. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/core/test_identity.py +0 -0
  349. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/core/test_merge_commit_detection.py +0 -0
  350. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/core/test_progress.py +0 -0
  351. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/core/test_weekly_cache.py +0 -0
  352. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/debug_bulk_exists.py +0 -0
  353. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/debug_commit_story_points.py +0 -0
  354. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/debug_database_storage.py +0 -0
  355. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/debug_jira_enrichment.py +0 -0
  356. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/debug_story_points.py +0 -0
  357. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/extractors/__init__.py +0 -0
  358. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/extractors/test_ticket_detection_config.py +0 -0
  359. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/integration/__init__.py +0 -0
  360. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/integration/conftest.py +0 -0
  361. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/integration/test_merge_exclusion_workflow.py +0 -0
  362. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/integrations/__init__.py +0 -0
  363. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/integrations/test_github_integration.py +0 -0
  364. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/metrics/__init__.py +0 -0
  365. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/models/__init__.py +0 -0
  366. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/models/test_pull_request_cache_v3.py +0 -0
  367. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/models/test_pull_request_cache_v4.py +0 -0
  368. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/qualitative/__init__.py +0 -0
  369. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/qualitative/test_basic_integration.py +0 -0
  370. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/qualitative/test_bedrock_batch.py +0 -0
  371. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/qualitative/test_complexity_rating.py +0 -0
  372. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/reports/__init__.py +0 -0
  373. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/reports/test_pr_reporting.py +0 -0
  374. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test-qa-install/test_error_handling.py +0 -0
  375. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test-qa-install/test_wizard_automated.py +0 -0
  376. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_atomic_caching.py +0 -0
  377. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_cache_invalidation.py +0 -0
  378. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_classification_system.py +0 -0
  379. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_cli.py +0 -0
  380. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_cli_wizards/__init__.py +0 -0
  381. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_cli_wizards/test_menu.py +0 -0
  382. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_config.py +0 -0
  383. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_config_extends.py +0 -0
  384. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_config_profiles.py +0 -0
  385. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_config_story_points.py +0 -0
  386. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_identity_llm_analyzer.py +0 -0
  387. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_install_wizard.py +0 -0
  388. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_interactive_launcher.py +0 -0
  389. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_llm_commit_classification.py +0 -0
  390. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_metrics.py +0 -0
  391. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_ml_accuracy.py +0 -0
  392. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_ml_components.py +0 -0
  393. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_ml_comprehensive.py +0 -0
  394. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_ml_integration.py +0 -0
  395. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_pipeline.py +0 -0
  396. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_pm_env_resolution.py +0 -0
  397. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_report_abstraction.py +0 -0
  398. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_reports.py +0 -0
  399. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_training_pipeline.py +0 -0
  400. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/test_two_step_process.py +0 -0
  401. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/tests/utils/__init__.py +0 -0
  402. {gitflow_analytics-3.13.22 → gitflow_analytics-3.13.24}/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.22
3
+ Version: 3.13.24
4
4
  Summary: Analyze Git repositories for developer productivity insights
5
5
  Author-email: Bob Matyas <bobmatnyc@gmail.com>
6
6
  License: MIT
@@ -1,4 +1,4 @@
1
1
  """Version information for gitflow-analytics."""
2
2
 
3
- __version__ = "3.13.22"
3
+ __version__ = "3.13.24"
4
4
  __version_info__ = tuple(int(x) for x in __version__.split("."))
@@ -740,6 +740,7 @@ class ConfigLoader(ConfigLoaderSectionsMixin):
740
740
  position=_td_raw.get("position", _td_defaults.position),
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
+ exclude_repos=list(_td_raw.get("exclude_repos", _td_defaults.exclude_repos)),
743
744
  )
744
745
 
745
746
  return AnalysisConfig(
@@ -360,6 +360,8 @@ class TicketDetectionConfig:
360
360
  - "CVE-\\d+"
361
361
  - "CWE-\\d+"
362
362
  - "\\d{8,}"
363
+ exclude_repos:
364
+ - "APEX" # knowledge base — exclude from ticket compliance
363
365
  """
364
366
 
365
367
  # Which commits to scan.
@@ -397,6 +399,13 @@ class TicketDetectionConfig:
397
399
  ]
398
400
  )
399
401
 
402
+ # Repository names to exclude from ticket compliance metrics.
403
+ # Commits from these repos are still included in activity reporting
404
+ # (commit counts, line counts, developer stats) but are excluded from
405
+ # ticket coverage rate calculations. Useful for knowledge-base or
406
+ # documentation repos where JIRA tickets are not expected.
407
+ exclude_repos: list[str] = field(default_factory=list)
408
+
400
409
 
401
410
  @dataclass
402
411
  class AnalysisConfig:
@@ -149,6 +149,11 @@ class TicketExtractor(TicketAnalysisMixin):
149
149
  )
150
150
  self._compiled_excludes: list[re.Pattern[str]] = [re.compile(p) for p in raw_excludes]
151
151
 
152
+ # Repository names to exclude from ticket compliance metrics.
153
+ self._exclude_repos: set[str] = (
154
+ set(ticket_detection_config.exclude_repos) if ticket_detection_config else set()
155
+ )
156
+
152
157
  # If config supplies custom per-platform patterns, use them; otherwise fall back
153
158
  # to the built-in defaults. The config patterns dict maps platform -> single
154
159
  # pattern string; the built-in defaults use lists.
@@ -202,7 +207,7 @@ class TicketExtractor(TicketAnalysisMixin):
202
207
  # Commit categorization patterns
203
208
  self.category_patterns = {
204
209
  "bug_fix": [
205
- r"^fix(\([^)]*\))?:", # Conventional commits: fix: or fix(scope):
210
+ r"^fix(\([^)]+\))?:", # Conventional commits: fix: or fix(scope):
206
211
  r"\b(fix|bug|error|issue|problem|crash|exception|failure)\b",
207
212
  r"\b(resolve|solve|repair|correct|corrected|address)\b",
208
213
  r"\b(hotfix|bugfix|patch|quickfix)\b",
@@ -217,9 +222,10 @@ class TicketExtractor(TicketAnalysisMixin):
217
222
  r"\bfixed?\s+(issue|problem|bug|error)\b",
218
223
  r"\bresolve[ds]?\s+(issue|problem|bug)\b",
219
224
  r"\brepair\b",
225
+ r"\b(incorrect|wrong|invalid)\b",
220
226
  ],
221
227
  "feature": [
222
- r"^(feat|feature)(\([^)]*\))?:", # Conventional commits: feat: or feat(scope):
228
+ r"^(feat|feature)(\([^)]+\))?:", # Conventional commits: feat: or feat(scope):
223
229
  r"\b(add|new|feature|implement|create|build)\b",
224
230
  r"\b(introduce|enhance|extend|expand)\b",
225
231
  r"\b(functionality|capability|support|enable)\b",
@@ -233,9 +239,11 @@ class TicketExtractor(TicketAnalysisMixin):
233
239
  r"\b(episode|episodes|audio|video)\s+(feature|support|implementation)\b",
234
240
  r"\b(beacon)\s+(implementation|for|tracking)\b",
235
241
  r"\b(localization)\s+(data|structure)\b",
242
+ r"\b(extract|harness|scaffold|bootstrap|wire|hook)\b",
243
+ r"\b(disable|toggle|flag)\b",
236
244
  ],
237
245
  "refactor": [
238
- r"^refactor(\([^)]*\))?:", # Conventional commits: refactor: or refactor(scope):
246
+ r"^refactor(\([^)]+\))?:", # Conventional commits: refactor: or refactor(scope):
239
247
  r"\b(refactor|restructure|reorganize|cleanup|clean up)\b",
240
248
  r"\b(optimize|improve|simplify|streamline)\b",
241
249
  r"\b(rename|move|extract|consolidate)\b",
@@ -268,7 +276,7 @@ class TicketExtractor(TicketAnalysisMixin):
268
276
  r"\b(doc|readme|changelog|docstring)\b.*\bcomments?\b",
269
277
  ],
270
278
  "deployment": [
271
- r"^deploy:",
279
+ r"^deploy(\([^)]+\))?:",
272
280
  r"\b(deploy|deployment|publish|rollout)\b",
273
281
  r"\b(production|prod|staging|live)\b",
274
282
  r"\b(go\s+live|launch|ship)\b",
@@ -290,6 +298,9 @@ class TicketExtractor(TicketAnalysisMixin):
290
298
  r"\b(schema)\b(?!.*\b(test|spec)\b)", # Schema but not test schemas
291
299
  r"\bsanity\s+schema\b",
292
300
  r"changing\s+(some)?\s*(user|role)\s+(roles?|permissions?)\b",
301
+ r"\b(npmrc|\.npmrc)\b",
302
+ r"\b(ECR)\b",
303
+ r"\b(GitHub\s+Actions|workflow)\b(?!.*\b(run|test)\b)",
293
304
  ],
294
305
  "content": [
295
306
  r"\b(content|copy|text|wording|messaging)\b",
@@ -337,7 +348,7 @@ class TicketExtractor(TicketAnalysisMixin):
337
348
  r"\b(improve|better)\s+(load|performance|speed)\b",
338
349
  ],
339
350
  "chore": [
340
- r"^chore:",
351
+ r"^chore(\([^)]+\))?:",
341
352
  r"\b(chore|cleanup|housekeeping|maintenance)\b",
342
353
  r"\b(routine|regular|scheduled)\b",
343
354
  r"\b(lint|linting|format|formatting|prettier)\b",
@@ -346,12 +357,17 @@ class TicketExtractor(TicketAnalysisMixin):
346
357
  r"\b(sync|auto-sync)\b",
347
358
  r"\b(script\s+update|merge\s+main)\b",
348
359
  r"removes?\s+(console|debug|log)\b",
360
+ # PR / code review response patterns
361
+ r"^PR\s+comments?\s*$",
362
+ r"(?:address|respond|applied?)\s+(?:PR|review|feedback|comments?)",
363
+ r"suggestion\s+from\s+@?copilot",
364
+ r"^apply\s+suggestion\b",
349
365
  ],
350
366
  "wip": [
351
367
  r"\b(wip|work\s+in\s+progress|temp|temporary|tmp)\b",
352
368
  r"\b(draft|unfinished|partial|incomplete)\b",
353
369
  r"\b(placeholder|todo|fixme)\b",
354
- r"^wip:",
370
+ r"^wip(\([^)]+\))?:",
355
371
  r"\b(experiment|experimental|poc|proof\s+of\s+concept)\b",
356
372
  r"\b(temporary|temp)\s+(fix|solution|workaround)\b",
357
373
  ],
@@ -359,11 +375,11 @@ class TicketExtractor(TicketAnalysisMixin):
359
375
  r"\b(version|bump|tag)\b",
360
376
  r"\b(v\d+\.\d+|version\s+\d+|\d+\.\d+\.\d+)\b",
361
377
  r"\b(major|minor|patch)\s+(version|release|bump)\b",
362
- r"^(version|bump):",
378
+ r"^(version|bump)(\([^)]+\))?:",
363
379
  r"\b(prepare\s+for\s+release|pre-release)\b",
364
380
  ],
365
381
  "maintenance": [
366
- r"^chore(\([^)]*\))?:", # Conventional commits: chore: or chore(scope):
382
+ r"^chore(\([^)]+\))?:", # Conventional commits: chore: or chore(scope):
367
383
  r"\b(update|upgrade|bump|maintenance|maint)\b",
368
384
  r"\b(dependency|dependencies|package|packages)\b",
369
385
  r"\b(npm\s+update|pip\s+install|yarn\s+upgrade)\b",
@@ -374,9 +390,13 @@ class TicketExtractor(TicketAnalysisMixin):
374
390
  r"\b(test|testing)\s+(change|update|fix)\b",
375
391
  r"\b(more|only)\s+(combo|beacon)\s+(hacking|fires?)\b",
376
392
  r"adds?\s+(console|debug|log)\b",
393
+ # Revert commits
394
+ r"^revert\b",
395
+ r"\breverting\b",
396
+ r"\breverted?\s",
377
397
  ],
378
398
  "test": [
379
- r"^test:",
399
+ r"^test(\([^)]+\))?:",
380
400
  r"\b(test|testing|spec|unit\s+test|integration\s+test)\b",
381
401
  r"\b(junit|pytest|mocha|jest|cypress|selenium)\b",
382
402
  r"\b(mock|stub|fixture|factory)\b",
@@ -389,14 +409,14 @@ class TicketExtractor(TicketAnalysisMixin):
389
409
  r"\btest\s+fix\b",
390
410
  ],
391
411
  "style": [
392
- r"^style:",
412
+ r"^style(\([^)]+\))?:",
393
413
  r"\b(format|formatting|style|lint|linting)\b",
394
414
  r"\b(prettier|eslint|black|autopep8|rubocop)\b",
395
415
  r"\b(whitespace|indentation|spacing|tabs)\b",
396
416
  r"\b(code\s+style|consistent|standardize)\b",
397
417
  ],
398
418
  "build": [
399
- r"^build:",
419
+ r"^build(\([^)]+\))?:",
400
420
  r"\b(build|compile|bundle|webpack|rollup)\b",
401
421
  r"\b(ci|cd|pipeline|workflow|github\s+actions)\b",
402
422
  r"\b(docker|dockerfile|makefile|npm\s+scripts)\b",
@@ -591,23 +611,36 @@ class TicketExtractor(TicketAnalysisMixin):
591
611
  "maintenance", # General maintenance terms
592
612
  ]
593
613
 
594
- # First, check for conventional commit patterns (^prefix:) which have absolute priority
595
- conventional_patterns = {
596
- "chore": r"^chore:",
597
- "style": r"^style:",
598
- "bug_fix": r"^fix:",
599
- "feature": r"^(feat|feature):",
600
- "test": r"^test:",
601
- "build": r"^build:",
602
- "deployment": r"^deploy:",
603
- "wip": r"^wip:",
604
- "version": r"^(version|bump):",
605
- }
614
+ # First, check for conventional commit patterns (^prefix: or ^prefix(scope):)
615
+ # which have absolute priority. The optional scope group handles
616
+ # messages like "fix(searchlight): ..." or "feat(agents): ...".
617
+ # Use a list of tuples to avoid duplicate key issues (build vs ci)
618
+ conventional_patterns = [
619
+ ("chore", r"^chore(\([^)]+\))?:"),
620
+ ("style", r"^style(\([^)]+\))?:"),
621
+ ("bug_fix", r"^fix(\([^)]+\))?:"),
622
+ ("feature", r"^(feat|feature)(\([^)]+\))?:"),
623
+ ("test", r"^test(\([^)]+\))?:"),
624
+ ("build", r"^build(\([^)]+\))?:"),
625
+ ("build", r"^ci(\([^)]+\))?:"),
626
+ ("deployment", r"^deploy(\([^)]+\))?:"),
627
+ ("wip", r"^wip(\([^)]+\))?:"),
628
+ ("version", r"^(version|bump)(\([^)]+\))?:"),
629
+ ("documentation", r"^docs(\([^)]+\))?:"),
630
+ ("refactor", r"^refactor(\([^)]+\))?:"),
631
+ ("performance", r"^perf(\([^)]+\))?:"),
632
+ ]
606
633
 
607
- for category, pattern in conventional_patterns.items():
634
+ for category, pattern in conventional_patterns:
608
635
  if re.match(pattern, message_lower):
609
636
  return category
610
637
 
638
+ # Check for revert commits early — before general body patterns, because
639
+ # revert messages often contain words that match other categories
640
+ # (e.g. "Revert incorrect ..." would match bug_fix's "incorrect" keyword).
641
+ if re.match(r"^revert\b", message_lower):
642
+ return "maintenance"
643
+
611
644
  # Then check categories in priority order for non-conventional patterns
612
645
  for category in priority_order:
613
646
  if category in self.compiled_category_patterns:
@@ -11,7 +11,6 @@ and on instance methods:
11
11
  """
12
12
 
13
13
  import logging
14
- import re
15
14
  from collections import defaultdict
16
15
  from datetime import timezone
17
16
  from typing import Any, cast
@@ -57,6 +56,27 @@ class TicketAnalysisMixin:
57
56
  untracked_commits: list[dict[str, Any]] = []
58
57
  ticket_summary: defaultdict[str, set[str]] = defaultdict(set)
59
58
 
59
+ # Filter out commits from repos excluded from ticket compliance metrics.
60
+ # These repos still appear in activity reporting but do not affect the
61
+ # ticket coverage denominator/numerator.
62
+ exclude_repos: set[str] = getattr(self, "_exclude_repos", set())
63
+ excluded_repo_commits = 0
64
+ if exclude_repos:
65
+ filtered_commits = []
66
+ for c in commits:
67
+ repo = (c.get("project_key") or "") if isinstance(c, dict) else ""
68
+ if repo in exclude_repos:
69
+ excluded_repo_commits += 1
70
+ else:
71
+ filtered_commits.append(c)
72
+ if excluded_repo_commits:
73
+ logger.info(
74
+ "Excluded %d commits from ticket compliance (repos: %s)",
75
+ excluded_repo_commits,
76
+ ", ".join(sorted(exclude_repos)),
77
+ )
78
+ commits = filtered_commits
79
+
60
80
  results = {
61
81
  "total_commits": len(commits),
62
82
  "total_prs": len(prs),
@@ -65,6 +85,7 @@ class TicketAnalysisMixin:
65
85
  "ticket_platforms": ticket_platforms,
66
86
  "untracked_commits": untracked_commits,
67
87
  "ticket_summary": ticket_summary,
88
+ "excluded_repo_commits": excluded_repo_commits,
68
89
  }
69
90
 
70
91
  commits_analyzed = 0
@@ -234,6 +255,11 @@ class TicketAnalysisMixin:
234
255
  if not commits:
235
256
  return {}
236
257
 
258
+ # Filter out commits from repos excluded from ticket compliance.
259
+ exclude_repos: set[str] = getattr(self, "_exclude_repos", set())
260
+ if exclude_repos:
261
+ commits = [c for c in commits if (c.get("project_key") or "") not in exclude_repos]
262
+
237
263
  developer_commits: dict[str, int] = {}
238
264
  developer_with_tickets: dict[str, int] = {}
239
265
 
@@ -263,9 +289,9 @@ class TicketAnalysisMixin:
263
289
  for developer_id in developer_commits:
264
290
  total = developer_commits[developer_id]
265
291
  with_tickets = developer_with_tickets[developer_id]
266
- coverage_by_developer[developer_id] = round(
267
- (with_tickets / total) * 100, 1
268
- ) if total > 0 else 0.0
292
+ coverage_by_developer[developer_id] = (
293
+ round((with_tickets / total) * 100, 1) if total > 0 else 0.0
294
+ )
269
295
 
270
296
  logger.debug(f"Calculated ticket coverage for {len(coverage_by_developer)} developers")
271
297
  return coverage_by_developer
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitflow-analytics
3
- Version: 3.13.22
3
+ Version: 3.13.24
4
4
  Summary: Analyze Git repositories for developer productivity insights
5
5
  Author-email: Bob Matyas <bobmatnyc@gmail.com>
6
6
  License: MIT
@@ -375,6 +375,7 @@ tests/core/test_merge_commit_detection.py
375
375
  tests/core/test_progress.py
376
376
  tests/core/test_weekly_cache.py
377
377
  tests/extractors/__init__.py
378
+ tests/extractors/test_commit_categorization.py
378
379
  tests/extractors/test_ticket_detection_config.py
379
380
  tests/integration/__init__.py
380
381
  tests/integration/conftest.py
@@ -0,0 +1,243 @@
1
+ """Tests for commit message categorization improvements.
2
+
3
+ Covers:
4
+ - Conventional commit scopes: fix(scope):, feat(scope):, chore(scope):, etc.
5
+ - Copilot/AI suggestion commits
6
+ - PR/code review response commits
7
+ - Revert commits
8
+ - Broader keyword matching for feature, bug_fix, configuration
9
+ - Additional conventional commit prefixes: docs:, refactor:, perf:, ci:
10
+ """
11
+
12
+ import pytest
13
+
14
+ from gitflow_analytics.extractors.tickets import TicketExtractor
15
+
16
+
17
+ @pytest.fixture
18
+ def extractor() -> TicketExtractor:
19
+ """Default extractor with no special config."""
20
+ return TicketExtractor()
21
+
22
+
23
+ # ---------------------------------------------------------------------------
24
+ # 1. Conventional commit scopes (the primary fix)
25
+ # ---------------------------------------------------------------------------
26
+
27
+
28
+ class TestConventionalCommitScopes:
29
+ """Conventional commits with scopes like fix(searchlight): must be classified."""
30
+
31
+ def test_fix_with_scope(self, extractor: TicketExtractor) -> None:
32
+ assert extractor.categorize_commit("fix(searchlight): remove BUP2 references") == "bug_fix"
33
+
34
+ def test_feat_with_scope(self, extractor: TicketExtractor) -> None:
35
+ assert extractor.categorize_commit("feat(agents): add YAML frontmatter") == "feature"
36
+
37
+ def test_chore_with_scope(self, extractor: TicketExtractor) -> None:
38
+ result = extractor.categorize_commit("chore(dead-code): remove stale ManageRatesPage")
39
+ assert result == "chore"
40
+
41
+ def test_test_with_scope(self, extractor: TicketExtractor) -> None:
42
+ assert extractor.categorize_commit("test(auth): add login integration tests") == "test"
43
+
44
+ def test_build_with_scope(self, extractor: TicketExtractor) -> None:
45
+ assert extractor.categorize_commit("build(docker): update base image") == "build"
46
+
47
+ def test_style_with_scope(self, extractor: TicketExtractor) -> None:
48
+ assert extractor.categorize_commit("style(lint): fix eslint warnings") == "style"
49
+
50
+ def test_docs_with_scope(self, extractor: TicketExtractor) -> None:
51
+ assert (
52
+ extractor.categorize_commit("docs(readme): update installation guide")
53
+ == "documentation"
54
+ )
55
+
56
+ def test_refactor_with_scope(self, extractor: TicketExtractor) -> None:
57
+ assert extractor.categorize_commit("refactor(api): simplify handler logic") == "refactor"
58
+
59
+ def test_perf_with_scope(self, extractor: TicketExtractor) -> None:
60
+ assert (
61
+ extractor.categorize_commit("perf(queries): optimize N+1 in user list") == "performance"
62
+ )
63
+
64
+ def test_ci_with_scope(self, extractor: TicketExtractor) -> None:
65
+ assert extractor.categorize_commit("ci(github): add deploy workflow") == "build"
66
+
67
+ def test_deploy_with_scope(self, extractor: TicketExtractor) -> None:
68
+ assert extractor.categorize_commit("deploy(prod): rollout v2.3.1") == "deployment"
69
+
70
+ def test_wip_with_scope(self, extractor: TicketExtractor) -> None:
71
+ assert extractor.categorize_commit("wip(dashboard): partial chart component") == "wip"
72
+
73
+ def test_version_with_scope(self, extractor: TicketExtractor) -> None:
74
+ assert extractor.categorize_commit("bump(deps): update lodash to 4.17.21") == "version"
75
+
76
+
77
+ # ---------------------------------------------------------------------------
78
+ # 2. Conventional commits WITHOUT scopes still work (backward compat)
79
+ # ---------------------------------------------------------------------------
80
+
81
+
82
+ class TestConventionalCommitsWithoutScope:
83
+ """Ensure plain prefix: patterns still classify correctly."""
84
+
85
+ def test_fix_no_scope(self, extractor: TicketExtractor) -> None:
86
+ assert extractor.categorize_commit("fix: handle null pointer in user service") == "bug_fix"
87
+
88
+ def test_feat_no_scope(self, extractor: TicketExtractor) -> None:
89
+ assert extractor.categorize_commit("feat: add user search endpoint") == "feature"
90
+
91
+ def test_chore_no_scope(self, extractor: TicketExtractor) -> None:
92
+ assert extractor.categorize_commit("chore: update dependencies") == "chore"
93
+
94
+ def test_docs_no_scope(self, extractor: TicketExtractor) -> None:
95
+ assert extractor.categorize_commit("docs: add API reference") == "documentation"
96
+
97
+ def test_refactor_no_scope(self, extractor: TicketExtractor) -> None:
98
+ assert extractor.categorize_commit("refactor: extract validation module") == "refactor"
99
+
100
+ def test_perf_no_scope(self, extractor: TicketExtractor) -> None:
101
+ assert extractor.categorize_commit("perf: cache database queries") == "performance"
102
+
103
+ def test_ci_no_scope(self, extractor: TicketExtractor) -> None:
104
+ assert extractor.categorize_commit("ci: add linting step to pipeline") == "build"
105
+
106
+
107
+ # ---------------------------------------------------------------------------
108
+ # 3. PR / code review / Copilot patterns
109
+ # ---------------------------------------------------------------------------
110
+
111
+
112
+ class TestPRAndCopilotPatterns:
113
+ """PR comments, code review responses, and Copilot suggestions."""
114
+
115
+ def test_pr_comments(self, extractor: TicketExtractor) -> None:
116
+ assert extractor.categorize_commit("PR comments") == "chore"
117
+
118
+ def test_pr_comment_singular(self, extractor: TicketExtractor) -> None:
119
+ assert extractor.categorize_commit("PR comment") == "chore"
120
+
121
+ def test_apply_suggestion_from_copilot(self, extractor: TicketExtractor) -> None:
122
+ assert extractor.categorize_commit("Apply suggestion from @Copilot") == "chore"
123
+
124
+ def test_apply_suggestion_copilot_lowercase(self, extractor: TicketExtractor) -> None:
125
+ assert extractor.categorize_commit("apply suggestion from copilot") == "chore"
126
+
127
+ def test_address_review_feedback(self, extractor: TicketExtractor) -> None:
128
+ assert extractor.categorize_commit("address review feedback") == "chore"
129
+
130
+ def test_address_pr_comments(self, extractor: TicketExtractor) -> None:
131
+ assert extractor.categorize_commit("address PR comments") == "chore"
132
+
133
+ def test_applied_review_comments(self, extractor: TicketExtractor) -> None:
134
+ assert extractor.categorize_commit("applied review comments") == "chore"
135
+
136
+
137
+ # ---------------------------------------------------------------------------
138
+ # 4. Revert commits
139
+ # ---------------------------------------------------------------------------
140
+
141
+
142
+ class TestRevertCommits:
143
+ """Revert commits starting with 'Revert' should classify as maintenance."""
144
+
145
+ def test_revert_at_start(self, extractor: TicketExtractor) -> None:
146
+ result = extractor.categorize_commit("Revert incorrect global ext variable bumps")
147
+ assert result == "maintenance"
148
+
149
+ def test_revert_with_quotes(self, extractor: TicketExtractor) -> None:
150
+ result = extractor.categorize_commit('Revert "add experimental feature flag"')
151
+ assert result == "maintenance"
152
+
153
+ def test_revert_simple(self, extractor: TicketExtractor) -> None:
154
+ result = extractor.categorize_commit("Revert last commit")
155
+ assert result == "maintenance"
156
+
157
+ def test_revert_merge(self, extractor: TicketExtractor) -> None:
158
+ result = extractor.categorize_commit("revert merge of feature branch")
159
+ assert result == "maintenance"
160
+
161
+ def test_reverting_in_body_matches_maintenance(self, extractor: TicketExtractor) -> None:
162
+ """'reverting' keyword in body (not at start) still matches via body patterns."""
163
+ result = extractor.categorize_commit("started reverting the old helper code")
164
+ assert result == "maintenance"
165
+
166
+
167
+ # ---------------------------------------------------------------------------
168
+ # 5. Broader feature keyword matching
169
+ # ---------------------------------------------------------------------------
170
+
171
+
172
+ class TestBroaderFeatureKeywords:
173
+ """Feature category should catch extraction/scaffolding/wiring work."""
174
+
175
+ def test_extracting_harness(self, extractor: TicketExtractor) -> None:
176
+ result = extractor.categorize_commit("start extracting first stage harness")
177
+ assert result == "feature"
178
+
179
+ def test_scaffold_component(self, extractor: TicketExtractor) -> None:
180
+ result = extractor.categorize_commit("scaffold the new dashboard component")
181
+ assert result == "feature"
182
+
183
+ def test_bootstrap_service(self, extractor: TicketExtractor) -> None:
184
+ result = extractor.categorize_commit("bootstrap payment service skeleton")
185
+ assert result == "feature"
186
+
187
+ def test_wire_up_endpoint(self, extractor: TicketExtractor) -> None:
188
+ result = extractor.categorize_commit("wire up the health check endpoint")
189
+ assert result == "feature"
190
+
191
+ def test_toggle_feature(self, extractor: TicketExtractor) -> None:
192
+ result = extractor.categorize_commit("toggle dark mode in settings")
193
+ assert result == "feature"
194
+
195
+ def test_disable_legacy_flow(self, extractor: TicketExtractor) -> None:
196
+ result = extractor.categorize_commit("disable legacy checkout flow")
197
+ assert result == "feature"
198
+
199
+
200
+ # ---------------------------------------------------------------------------
201
+ # 6. Configuration patterns
202
+ # ---------------------------------------------------------------------------
203
+
204
+
205
+ class TestConfigurationPatterns:
206
+ """Configuration category should catch ECR, npmrc, GitHub Actions."""
207
+
208
+ def test_npmrc_config_update(self, extractor: TicketExtractor) -> None:
209
+ """When message does not contain feature-triggering words like 'add'."""
210
+ result = extractor.categorize_commit("update .npmrc for private registry")
211
+ assert result == "configuration"
212
+
213
+ def test_ecr_config(self, extractor: TicketExtractor) -> None:
214
+ """ECR without security-triggering words like 'token'."""
215
+ result = extractor.categorize_commit("ECR registry configuration change")
216
+ assert result == "configuration"
217
+
218
+ def test_github_actions_workflow(self, extractor: TicketExtractor) -> None:
219
+ """GitHub Actions matches build (ci/pipeline patterns) due to priority."""
220
+ result = extractor.categorize_commit("update GitHub Actions deploy workflow")
221
+ # "workflow" and "github actions" match build category (ci/pipeline patterns)
222
+ assert result == "build"
223
+
224
+
225
+ # ---------------------------------------------------------------------------
226
+ # 7. Bug fix broader patterns
227
+ # ---------------------------------------------------------------------------
228
+
229
+
230
+ class TestBugFixBroaderPatterns:
231
+ """Bug fix category catches incorrect/wrong/invalid keywords."""
232
+
233
+ def test_incorrect_variable(self, extractor: TicketExtractor) -> None:
234
+ result = extractor.categorize_commit("incorrect global ext variable bumps")
235
+ assert result == "bug_fix"
236
+
237
+ def test_wrong_import(self, extractor: TicketExtractor) -> None:
238
+ result = extractor.categorize_commit("wrong import path for utils")
239
+ assert result == "bug_fix"
240
+
241
+ def test_invalid_json(self, extractor: TicketExtractor) -> None:
242
+ result = extractor.categorize_commit("invalid JSON response from API")
243
+ assert result == "bug_fix"