gitflow-analytics 3.13.21__tar.gz → 3.13.23__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 (401) hide show
  1. {gitflow_analytics-3.13.21/src/gitflow_analytics.egg-info → gitflow_analytics-3.13.23}/PKG-INFO +1 -1
  2. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/_version.py +1 -1
  3. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/config/loader.py +13 -0
  4. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/config/schema.py +61 -0
  5. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/analysis_components.py +13 -2
  6. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/analyze_pipeline.py +36 -33
  7. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/data_fetcher.py +15 -24
  8. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/extractors/ml_tickets.py +6 -4
  9. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/extractors/tickets.py +133 -9
  10. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pipeline_collect.py +1 -0
  11. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23/src/gitflow_analytics.egg-info}/PKG-INFO +1 -1
  12. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics.egg-info/SOURCES.txt +1 -0
  13. gitflow_analytics-3.13.23/tests/extractors/test_ticket_detection_config.py +401 -0
  14. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/CHANGELOG.md +0 -0
  15. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/CLAUDE.md +0 -0
  16. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/LICENSE +0 -0
  17. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/MANIFEST.in +0 -0
  18. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/README.md +0 -0
  19. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/DOCUMENTATION-STANDARDS.md +0 -0
  20. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/README.md +0 -0
  21. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/SECURITY.md +0 -0
  22. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/STRUCTURE.md +0 -0
  23. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/README.md +0 -0
  24. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/analysis-files/ewtn-critical-security-report.md +0 -0
  25. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_engineer_20250915_085239_236.md +0 -0
  26. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_engineer_20250915_114233_697.md +0 -0
  27. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_engineer_20250915_115330_511.md +0 -0
  28. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_engineer_20250915_120516_669.md +0 -0
  29. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_engineer_20250915_124906_951.md +0 -0
  30. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_engineer_20250915_175540_671.md +0 -0
  31. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_engineer_20250915_214023_300.md +0 -0
  32. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_engineer_20250916_130622_510.md +0 -0
  33. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_ops_20250915_123323_419.md +0 -0
  34. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_ops_20250915_134446_128.md +0 -0
  35. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_ops_20250915_184656_725.md +0 -0
  36. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_research_20250915_091233_023.md +0 -0
  37. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_research_20250915_100404_339.md +0 -0
  38. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/agent_research_20250915_110606_413.md +0 -0
  39. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/system_prompt_20250915_084833_641.md +0 -0
  40. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/system_prompt_20250915_090830_660.md +0 -0
  41. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-logs/prompts/system_prompt_20250916_130545_822.md +0 -0
  42. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-reports/output/database_qualitative_report_20250630_20250824.md +0 -0
  43. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-reports/output/narrative_report_20250630_20250824.md +0 -0
  44. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-reports/reports-24week/database_qualitative_report_20250303_20250817.md +0 -0
  45. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-reports/reports-24week/narrative_report_20250303_20250817.md +0 -0
  46. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-reports/test-ewtn-reports/narrative_report_20250810.md +0 -0
  47. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-reports/test-reports/database_qualitative_report_20250908_20250914.md +0 -0
  48. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-reports/test-reports/narrative_report_20250908_20250914.md +0 -0
  49. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-reports/test-weekly-reports/database_qualitative_report_20250623_20250817.md +0 -0
  50. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/old-reports/test-weekly-reports/narrative_report_20250623_20250817.md +0 -0
  51. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/CHANGELOG_INTERACTIVE_LAUNCHER.md +0 -0
  52. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/CLEANUP_SUMMARY-20250929.md +0 -0
  53. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/FEATURES_READY_FOR_TESTING.md +0 -0
  54. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/FIX_SUMMARY.md +0 -0
  55. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/IMPLEMENTATION_SUMMARY.md +0 -0
  56. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/PROGRESS_TRACKING_FIXES.md +0 -0
  57. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/PROJECT_CLEANUP_REPORT-20250929.md +0 -0
  58. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/README.md +0 -0
  59. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/STORY_POINTS_CONFIG_SUMMARY-archived.md +0 -0
  60. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/SYNTAX_ERROR_FIX.md +0 -0
  61. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/TEST_REPORT_GIT_CLONING.md +0 -0
  62. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/TIMEZONE_BUG_RESOLUTION.md +0 -0
  63. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/USAGE_EXAMPLES-archived.md +0 -0
  64. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/_archive/temp-files/code_analysis_report.md +0 -0
  65. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/architecture/README.md +0 -0
  66. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/architecture/branch-analysis-optimization.md +0 -0
  67. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/architecture/caching-strategy.md +0 -0
  68. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/architecture/llm-classifier-refactoring.md +0 -0
  69. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/architecture/ml-pipeline.md +0 -0
  70. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/cicd-integration-implementation-summary.md +0 -0
  71. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/configuration/configuration.md +0 -0
  72. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/deployment/README.md +0 -0
  73. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/design/README.md +0 -0
  74. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/design/circuit-breaker-implementation.md +0 -0
  75. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/design/commit-classification-design.md +0 -0
  76. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/design/git_pm_correlation_design.md +0 -0
  77. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/design/platform-agnostic-pm-framework.md +0 -0
  78. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/design/qualitative_data_extraction.md +0 -0
  79. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/developer/README.md +0 -0
  80. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/developer/contributing.md +0 -0
  81. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/developer/development-setup.md +0 -0
  82. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/developer/project-organization.md +0 -0
  83. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/developer/refactoring-guide.md +0 -0
  84. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/developer/training-guide.md +0 -0
  85. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/examples/README.md +0 -0
  86. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/examples/interactive-launcher-examples.md +0 -0
  87. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/examples/story-points-configuration.md +0 -0
  88. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/getting-started/README.md +0 -0
  89. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/getting-started/first-analysis.md +0 -0
  90. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/getting-started/installation.md +0 -0
  91. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/getting-started/quickstart.md +0 -0
  92. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/guides/LLM_CLASSIFICATION_GUIDE.md +0 -0
  93. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/guides/README.md +0 -0
  94. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/guides/chatgpt-setup.md +0 -0
  95. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/guides/identity-resolution-enhanced.md +0 -0
  96. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/guides/interactive-launcher.md +0 -0
  97. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/guides/managing-aliases.md +0 -0
  98. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/guides/ml-categorization.md +0 -0
  99. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/guides/pm-platform-setup.md +0 -0
  100. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/guides/troubleshooting.md +0 -0
  101. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/managers/README.md +0 -0
  102. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/managers/dashboard-guide.md +0 -0
  103. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/managers/faq.md +0 -0
  104. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/managers/interpreting-reports.md +0 -0
  105. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/managers/metrics-reference.md +0 -0
  106. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/managers/quickstart.md +0 -0
  107. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/quick-reference/launcher-and-identity.md +0 -0
  108. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/reference/README.md +0 -0
  109. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/reference/cache-system.md +0 -0
  110. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/reference/cli-commands.md +0 -0
  111. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/reference/configuration-schema.md +0 -0
  112. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/reference/json-export-schema.md +0 -0
  113. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/bedrock-classify-fallback-debug-2026-02-26.md +0 -0
  114. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/bedrock-llm-not-called-2026-02-27.md +0 -0
  115. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/bug-investigation-issues-2-3-4-2026-02-03.md +0 -0
  116. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/cache-missing-repos-investigation-2026-02-27.md +0 -0
  117. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/cicd-integration-patterns-2025-02-09.md +0 -0
  118. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/classify-pipeline-reclassify-feature-2026-02-26.md +0 -0
  119. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/cli-refactoring-plan-2026-02-26.md +0 -0
  120. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/code-review-low-hanging-fruit-2026-02-25.md +0 -0
  121. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/commit-classification-complexity-field-2026-02-27.md +0 -0
  122. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/commit-classification-verification-2026-02-26.md +0 -0
  123. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/csv-generation-narrative-bug-20251222.md +0 -0
  124. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/data-fetching-architecture-2026-02-26.md +0 -0
  125. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/github-auth-requirement-investigation-2026-02-25.md +0 -0
  126. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/identity-alias-system-2026-02-26.md +0 -0
  127. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/identity-resolution-architecture-2026-02-27.md +0 -0
  128. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/manager-onboarding-documentation-analysis-2026-02-03.md +0 -0
  129. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/memory-leak-analysis-2026-02-26.md +0 -0
  130. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/narrative-report-developer-names-2026-02-27.md +0 -0
  131. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/pipeline-data-points-audit-2026-02-27.md +0 -0
  132. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/pr-data-model-and-status-tracking-2026-02-26.md +0 -0
  133. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/pr-fetching-report-vs-analyze-2026-02-27.md +0 -0
  134. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/pr-tracking-and-alias-gap-analysis-2026-02-25.md +0 -0
  135. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/pr-tracking-capabilities-analysis-2026-02-25.md +0 -0
  136. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/qa-report-2026-02-16-week.md +0 -0
  137. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/test-cli-memory-leak-root-cause-2026-02-26.md +0 -0
  138. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/docs/research/week-segmentation-bug-investigation-2026-02-25.md +0 -0
  139. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/pyproject.toml +0 -0
  140. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/setup.cfg +0 -0
  141. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/__init__.py +0 -0
  142. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/classification/__init__.py +0 -0
  143. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/classification/batch_classifier.py +0 -0
  144. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/classification/batch_classifier_impl.py +0 -0
  145. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/classification/classifier.py +0 -0
  146. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/classification/feature_extractor.py +0 -0
  147. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/classification/linguist_analyzer.py +0 -0
  148. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/classification/model.py +0 -0
  149. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli.py +0 -0
  150. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_analysis.py +0 -0
  151. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_analysis_helpers.py +0 -0
  152. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_analysis_modes.py +0 -0
  153. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_analysis_orchestrator.py +0 -0
  154. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_fetch.py +0 -0
  155. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_formatting.py +0 -0
  156. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_identity.py +0 -0
  157. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_identity_alias_ops.py +0 -0
  158. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_identity_commands.py +0 -0
  159. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_pipeline_commands.py +0 -0
  160. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_setup.py +0 -0
  161. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_training.py +0 -0
  162. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_utils.py +0 -0
  163. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_wizards/__init__.py +0 -0
  164. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_wizards/install_wizard.py +0 -0
  165. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_wizards/install_wizard_output.py +0 -0
  166. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_wizards/install_wizard_pm.py +0 -0
  167. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_wizards/install_wizard_repos.py +0 -0
  168. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_wizards/menu.py +0 -0
  169. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/cli_wizards/run_launcher.py +0 -0
  170. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/config/__init__.py +0 -0
  171. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/config/aliases.py +0 -0
  172. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/config/errors.py +0 -0
  173. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/config/loader_sections.py +0 -0
  174. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/config/profiles.py +0 -0
  175. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/config/repository.py +0 -0
  176. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/config/validator.py +0 -0
  177. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/config.py +0 -0
  178. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/constants.py +0 -0
  179. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/__init__.py +0 -0
  180. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/analyze_pipeline_helpers.py +0 -0
  181. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/analyze_pipeline_reports.py +0 -0
  182. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/analyzer.py +0 -0
  183. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/analyzer_commit.py +0 -0
  184. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/analyzer_git.py +0 -0
  185. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/branch_mapper.py +0 -0
  186. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/cache.py +0 -0
  187. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/cache_commits.py +0 -0
  188. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/cache_weekly.py +0 -0
  189. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/data_fetcher_git.py +0 -0
  190. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/data_fetcher_parallel.py +0 -0
  191. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/data_fetcher_processing.py +0 -0
  192. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/git_auth.py +0 -0
  193. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/git_timeout_wrapper.py +0 -0
  194. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/identity.py +0 -0
  195. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/identity_stats.py +0 -0
  196. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/metrics_storage.py +0 -0
  197. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/progress.py +0 -0
  198. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/repo_cloner.py +0 -0
  199. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/schema_version.py +0 -0
  200. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/core/subprocess_git.py +0 -0
  201. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/extractors/__init__.py +0 -0
  202. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/extractors/base.py +0 -0
  203. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/extractors/ml_prediction_cache.py +0 -0
  204. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/extractors/ml_tickets_analysis.py +0 -0
  205. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/extractors/story_points.py +0 -0
  206. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/extractors/tickets_analysis.py +0 -0
  207. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/identity_llm/__init__.py +0 -0
  208. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/identity_llm/analysis_pass.py +0 -0
  209. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/identity_llm/analyzer.py +0 -0
  210. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/identity_llm/models.py +0 -0
  211. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/integrations/__init__.py +0 -0
  212. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/integrations/cicd/__init__.py +0 -0
  213. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/integrations/cicd/base.py +0 -0
  214. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/integrations/cicd/github_actions.py +0 -0
  215. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/integrations/github_integration.py +0 -0
  216. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/integrations/jira_integration.py +0 -0
  217. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/integrations/orchestrator.py +0 -0
  218. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/metrics/__init__.py +0 -0
  219. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/metrics/activity_scoring.py +0 -0
  220. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/metrics/branch_health.py +0 -0
  221. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/metrics/dora.py +0 -0
  222. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/models/__init__.py +0 -0
  223. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/models/database.py +0 -0
  224. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/models/database_base.py +0 -0
  225. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/models/database_commit_models.py +0 -0
  226. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/models/database_identity_models.py +0 -0
  227. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/models/database_metrics_models.py +0 -0
  228. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pipeline.py +0 -0
  229. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pipeline_classify.py +0 -0
  230. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pipeline_report.py +0 -0
  231. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pipeline_types.py +0 -0
  232. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pm_framework/__init__.py +0 -0
  233. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pm_framework/adapters/__init__.py +0 -0
  234. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pm_framework/adapters/jira_adapter.py +0 -0
  235. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pm_framework/adapters/jira_adapter_converters.py +0 -0
  236. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pm_framework/adapters/jira_cache.py +0 -0
  237. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pm_framework/base.py +0 -0
  238. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pm_framework/models.py +0 -0
  239. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pm_framework/orchestrator.py +0 -0
  240. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/pm_framework/registry.py +0 -0
  241. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/__init__.py +0 -0
  242. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/chatgpt_analyzer.py +0 -0
  243. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/__init__.py +0 -0
  244. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/change_type.py +0 -0
  245. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/domain_classifier.py +0 -0
  246. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/intent_analyzer.py +0 -0
  247. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/llm/__init__.py +0 -0
  248. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/llm/base.py +0 -0
  249. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/llm/batch_processor.py +0 -0
  250. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/llm/bedrock_client.py +0 -0
  251. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/llm/cache.py +0 -0
  252. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/llm/cost_tracker.py +0 -0
  253. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/llm/openai_client.py +0 -0
  254. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/llm/prompts.py +0 -0
  255. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/llm/response_parser.py +0 -0
  256. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/llm_commit_classifier.py +0 -0
  257. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/classifiers/risk_analyzer.py +0 -0
  258. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/core/__init__.py +0 -0
  259. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/core/llm_fallback.py +0 -0
  260. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/core/nlp_engine.py +0 -0
  261. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/core/pattern_cache.py +0 -0
  262. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/core/processor.py +0 -0
  263. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/enhanced_analyzer.py +0 -0
  264. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/enhanced_analyzer_developer.py +0 -0
  265. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/enhanced_analyzer_executive.py +0 -0
  266. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/enhanced_analyzer_projects.py +0 -0
  267. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/enhanced_analyzer_workflow.py +0 -0
  268. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/example_enhanced_usage.py +0 -0
  269. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/models/__init__.py +0 -0
  270. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/models/schemas.py +0 -0
  271. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/utils/__init__.py +0 -0
  272. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/utils/batch_processor.py +0 -0
  273. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/utils/cost_tracker.py +0 -0
  274. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/utils/metrics.py +0 -0
  275. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/qualitative/utils/text_processing.py +0 -0
  276. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/__init__.py +0 -0
  277. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/analytics_patterns.py +0 -0
  278. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/analytics_writer.py +0 -0
  279. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/base.py +0 -0
  280. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/branch_health_writer.py +0 -0
  281. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/classification_csv.py +0 -0
  282. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/classification_writer.py +0 -0
  283. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/cli_integration.py +0 -0
  284. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/csv_reports_developer.py +0 -0
  285. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/csv_reports_dora.py +0 -0
  286. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/csv_reports_weekly.py +0 -0
  287. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/csv_writer.py +0 -0
  288. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/data_models.py +0 -0
  289. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/database_report_generator.py +0 -0
  290. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/example_usage.py +0 -0
  291. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/factory.py +0 -0
  292. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/formatters.py +0 -0
  293. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/html_generator.py +0 -0
  294. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/html_sections.py +0 -0
  295. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/interfaces.py +0 -0
  296. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/json_export_builders.py +0 -0
  297. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/json_export_developer.py +0 -0
  298. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/json_export_executive.py +0 -0
  299. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/json_export_insights.py +0 -0
  300. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/json_export_utils.py +0 -0
  301. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/json_exporter.py +0 -0
  302. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/narrative_analysis.py +0 -0
  303. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/narrative_classification.py +0 -0
  304. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/narrative_executive.py +0 -0
  305. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/narrative_recommendations.py +0 -0
  306. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/narrative_team.py +0 -0
  307. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/narrative_writer.py +0 -0
  308. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/story_point_correlation.py +0 -0
  309. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/story_point_helpers.py +0 -0
  310. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/reports/weekly_trends_writer.py +0 -0
  311. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/security/__init__.py +0 -0
  312. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/security/config.py +0 -0
  313. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/security/extractors/__init__.py +0 -0
  314. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/security/extractors/dependency_checker.py +0 -0
  315. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/security/extractors/secret_detector.py +0 -0
  316. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/security/extractors/vulnerability_scanner.py +0 -0
  317. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/security/llm_analyzer.py +0 -0
  318. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/security/reports/__init__.py +0 -0
  319. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/security/reports/security_report.py +0 -0
  320. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/security/security_analyzer.py +0 -0
  321. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/training/__init__.py +0 -0
  322. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/training/model_loader.py +0 -0
  323. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/training/pipeline.py +0 -0
  324. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/types/__init__.py +0 -0
  325. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/types/commit_types.py +0 -0
  326. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/ui/__init__.py +0 -0
  327. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/ui/progress_display.py +0 -0
  328. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/ui/progress_display_rich.py +0 -0
  329. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/ui/progress_display_rich_render.py +0 -0
  330. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/utils/__init__.py +0 -0
  331. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/utils/commit_utils.py +0 -0
  332. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/utils/date_utils.py +0 -0
  333. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/utils/debug.py +0 -0
  334. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/utils/glob_matcher.py +0 -0
  335. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics/verify_activity.py +0 -0
  336. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics.egg-info/dependency_links.txt +0 -0
  337. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics.egg-info/entry_points.txt +0 -0
  338. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics.egg-info/requires.txt +0 -0
  339. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/src/gitflow_analytics.egg-info/top_level.txt +0 -0
  340. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/__init__.py +0 -0
  341. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/conftest.py +0 -0
  342. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/core/__init__.py +0 -0
  343. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/core/test_analyzer.py +0 -0
  344. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/core/test_analyzer_merge_stats.py +0 -0
  345. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/core/test_cache.py +0 -0
  346. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/core/test_data_fetcher.py +0 -0
  347. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/core/test_data_fetcher_merge_stats.py +0 -0
  348. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/core/test_identity.py +0 -0
  349. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/core/test_merge_commit_detection.py +0 -0
  350. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/core/test_progress.py +0 -0
  351. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/core/test_weekly_cache.py +0 -0
  352. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/debug_bulk_exists.py +0 -0
  353. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/debug_commit_story_points.py +0 -0
  354. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/debug_database_storage.py +0 -0
  355. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/debug_jira_enrichment.py +0 -0
  356. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/debug_story_points.py +0 -0
  357. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/extractors/__init__.py +0 -0
  358. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/integration/__init__.py +0 -0
  359. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/integration/conftest.py +0 -0
  360. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/integration/test_merge_exclusion_workflow.py +0 -0
  361. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/integrations/__init__.py +0 -0
  362. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/integrations/test_github_integration.py +0 -0
  363. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/metrics/__init__.py +0 -0
  364. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/models/__init__.py +0 -0
  365. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/models/test_pull_request_cache_v3.py +0 -0
  366. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/models/test_pull_request_cache_v4.py +0 -0
  367. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/qualitative/__init__.py +0 -0
  368. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/qualitative/test_basic_integration.py +0 -0
  369. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/qualitative/test_bedrock_batch.py +0 -0
  370. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/qualitative/test_complexity_rating.py +0 -0
  371. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/reports/__init__.py +0 -0
  372. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/reports/test_pr_reporting.py +0 -0
  373. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test-qa-install/test_error_handling.py +0 -0
  374. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test-qa-install/test_wizard_automated.py +0 -0
  375. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_atomic_caching.py +0 -0
  376. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_cache_invalidation.py +0 -0
  377. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_classification_system.py +0 -0
  378. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_cli.py +0 -0
  379. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_cli_wizards/__init__.py +0 -0
  380. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_cli_wizards/test_menu.py +0 -0
  381. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_config.py +0 -0
  382. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_config_extends.py +0 -0
  383. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_config_profiles.py +0 -0
  384. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_config_story_points.py +0 -0
  385. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_identity_llm_analyzer.py +0 -0
  386. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_install_wizard.py +0 -0
  387. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_interactive_launcher.py +0 -0
  388. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_llm_commit_classification.py +0 -0
  389. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_metrics.py +0 -0
  390. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_ml_accuracy.py +0 -0
  391. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_ml_components.py +0 -0
  392. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_ml_comprehensive.py +0 -0
  393. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_ml_integration.py +0 -0
  394. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_pipeline.py +0 -0
  395. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_pm_env_resolution.py +0 -0
  396. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_report_abstraction.py +0 -0
  397. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_reports.py +0 -0
  398. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_training_pipeline.py +0 -0
  399. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/test_two_step_process.py +0 -0
  400. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/tests/utils/__init__.py +0 -0
  401. {gitflow_analytics-3.13.21 → gitflow_analytics-3.13.23}/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.21
3
+ Version: 3.13.23
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.21"
3
+ __version__ = "3.13.23"
4
4
  __version_info__ = tuple(int(x) for x in __version__.split("."))
@@ -32,6 +32,7 @@ from .schema import (
32
32
  LLMClassificationConfig,
33
33
  MLCategorization,
34
34
  RepositoryConfig,
35
+ TicketDetectionConfig,
35
36
  )
36
37
  from .validator import ConfigValidator
37
38
 
@@ -730,6 +731,17 @@ class ConfigLoader(ConfigLoaderSectionsMixin):
730
731
  strip_suffixes=list(identity_raw.get("strip_suffixes", [])),
731
732
  )
732
733
 
734
+ # Build TicketDetectionConfig from optional analysis.ticket_detection sub-section.
735
+ _td_raw: dict[str, Any] = analysis_data.get("ticket_detection") or {}
736
+ _td_defaults = TicketDetectionConfig()
737
+ ticket_detection_config = TicketDetectionConfig(
738
+ commit_filter=_td_raw.get("commit_filter", _td_defaults.commit_filter),
739
+ target_branches=list(_td_raw.get("target_branches", _td_defaults.target_branches)),
740
+ position=_td_raw.get("position", _td_defaults.position),
741
+ patterns=dict(_td_raw.get("patterns", _td_defaults.patterns)),
742
+ exclude_patterns=list(_td_raw.get("exclude_patterns", _td_defaults.exclude_patterns)),
743
+ )
744
+
733
745
  return AnalysisConfig(
734
746
  story_point_patterns=analysis_data.get(
735
747
  "story_point_patterns",
@@ -751,6 +763,7 @@ class ConfigLoader(ConfigLoaderSectionsMixin):
751
763
  default_ticket_platform=analysis_data.get("default_ticket_platform"),
752
764
  branch_mapping_rules=analysis_data.get("branch_mapping_rules", {}),
753
765
  ticket_platforms=analysis_data.get("ticket_platforms"),
766
+ ticket_detection=ticket_detection_config,
754
767
  auto_identity_analysis=identity_raw.get("auto_analysis", True),
755
768
  branch_patterns=analysis_data.get("branch_patterns"),
756
769
  branch_analysis=branch_analysis_config,
@@ -338,6 +338,66 @@ class IdentityConfig:
338
338
  strip_suffixes: list[str] = field(default_factory=list)
339
339
 
340
340
 
341
+ @dataclass
342
+ class TicketDetectionConfig:
343
+ """Configurable ticket detection settings.
344
+
345
+ Controls which commits are scanned for ticket references, how pattern
346
+ matching is anchored, which patterns are used, and which matches to
347
+ exclude post-extraction.
348
+
349
+ YAML example::
350
+
351
+ analysis:
352
+ ticket_detection:
353
+ commit_filter: "squash_merges_only"
354
+ target_branches: ["develop", "main"]
355
+ position: "start"
356
+ patterns:
357
+ jira: "([A-Z]{2,10}-\\d+)"
358
+ github: "(?:closes|fixes|resolves)\\s+#(\\d+)"
359
+ exclude_patterns:
360
+ - "CVE-\\d+"
361
+ - "CWE-\\d+"
362
+ - "\\d{8,}"
363
+ """
364
+
365
+ # Which commits to scan.
366
+ # "all" – every commit (current/default behaviour)
367
+ # "squash_merges_only"– only single-parent commits on target_branches
368
+ # "merge_commits" – only commits with >1 parent
369
+ commit_filter: str = "all"
370
+
371
+ # Branches considered as "integration" branches for squash-merge detection.
372
+ target_branches: list[str] = field(default_factory=lambda: ["develop", "main", "master"])
373
+
374
+ # Where in the commit message to match ticket patterns.
375
+ # "anywhere" – search the whole message (current behaviour)
376
+ # "start" – anchor patterns with ^ (match only at message start)
377
+ position: str = "anywhere"
378
+
379
+ # Regex patterns keyed by platform name. These REPLACE the built-in
380
+ # defaults when non-empty; when empty the extractor falls back to its
381
+ # hard-coded patterns.
382
+ patterns: dict[str, str] = field(
383
+ default_factory=lambda: {
384
+ "jira": r"([A-Z]{2,10}-\d+)",
385
+ "github": r"(?:closes|fixes|resolves)\s+#(\d+)",
386
+ }
387
+ )
388
+
389
+ # Regex patterns whose matches should be removed after extraction.
390
+ # Any extracted ticket ID that fully matches one of these patterns is
391
+ # discarded (e.g. CVE numbers, date-like strings).
392
+ exclude_patterns: list[str] = field(
393
+ default_factory=lambda: [
394
+ r"CVE-\d+",
395
+ r"CWE-\d+",
396
+ r"\d{8,}", # long digit strings (dates, IDs)
397
+ ]
398
+ )
399
+
400
+
341
401
  @dataclass
342
402
  class AnalysisConfig:
343
403
  """Analysis-specific configuration."""
@@ -353,6 +413,7 @@ class AnalysisConfig:
353
413
  default_ticket_platform: Optional[str] = None
354
414
  branch_mapping_rules: dict[str, list[str]] = field(default_factory=dict)
355
415
  ticket_platforms: Optional[list[str]] = None
416
+ ticket_detection: TicketDetectionConfig = field(default_factory=TicketDetectionConfig)
356
417
  auto_identity_analysis: bool = True # Enable automatic identity analysis by default
357
418
  branch_patterns: Optional[list[str]] = (
358
419
  None # Branch patterns to analyze (e.g., ["*"] for all branches)
@@ -13,12 +13,15 @@ receive fully-constructed objects and can substitute mocks or subclasses.
13
13
  from __future__ import annotations
14
14
 
15
15
  import logging
16
- from typing import Any
16
+ from typing import TYPE_CHECKING, Any
17
17
 
18
18
  from ..extractors.story_points import StoryPointExtractor
19
19
  from ..extractors.tickets import TicketExtractor
20
20
  from .branch_mapper import BranchToProjectMapper
21
21
 
22
+ if TYPE_CHECKING:
23
+ from ..config.schema import TicketDetectionConfig
24
+
22
25
  # Import ML extractor with graceful fallback
23
26
  try:
24
27
  from ..extractors.ml_tickets import MLTicketExtractor
@@ -50,6 +53,7 @@ def build_ticket_extractor(
50
53
  ml_config: dict[str, Any] | None = None,
51
54
  llm_config: dict[str, Any] | None = None,
52
55
  cache_dir: Any | None = None,
56
+ ticket_detection_config: TicketDetectionConfig | None = None,
53
57
  ) -> TicketExtractor:
54
58
  """Create the appropriate TicketExtractor based on configuration.
55
59
 
@@ -64,6 +68,9 @@ def build_ticket_extractor(
64
68
  is returned.
65
69
  llm_config: LLM classification configuration dict.
66
70
  cache_dir: Cache directory for ML prediction persistence.
71
+ ticket_detection_config: Optional :class:`~gitflow_analytics.config.schema.TicketDetectionConfig`
72
+ controlling commit filtering, position anchoring, custom
73
+ patterns, and exclude-pattern post-filtering.
67
74
 
68
75
  Returns:
69
76
  TicketExtractor (or MLTicketExtractor subclass) instance.
@@ -80,6 +87,7 @@ def build_ticket_extractor(
80
87
  cache_dir=cache_dir,
81
88
  enable_ml=True,
82
89
  enable_llm=enable_llm,
90
+ ticket_detection_config=ticket_detection_config,
83
91
  )
84
92
 
85
93
  # Log why ML is not used
@@ -94,7 +102,10 @@ def build_ticket_extractor(
94
102
  else:
95
103
  logger.debug("Using standard ticket extractor")
96
104
 
97
- return TicketExtractor(allowed_platforms=allowed_platforms)
105
+ return TicketExtractor(
106
+ allowed_platforms=allowed_platforms,
107
+ ticket_detection_config=ticket_detection_config,
108
+ )
98
109
 
99
110
 
100
111
  def build_branch_mapper(
@@ -15,11 +15,10 @@ from __future__ import annotations
15
15
 
16
16
  import contextlib
17
17
  import logging
18
- import os
19
- from dataclasses import dataclass, field
18
+ from dataclasses import dataclass
20
19
  from datetime import datetime, timedelta, timezone
21
20
  from pathlib import Path
22
- from typing import Any, Callable, Optional
21
+ from typing import Any, Callable
23
22
 
24
23
  logger = logging.getLogger(__name__)
25
24
 
@@ -97,7 +96,7 @@ class QualitativeResult:
97
96
  """Output of the qualitative-analysis stage."""
98
97
 
99
98
  results: list[Any]
100
- cost_stats: Optional[dict[str, Any]]
99
+ cost_stats: dict[str, Any] | None
101
100
  commits_for_qual: list[dict[str, Any]] # kept for JSON export
102
101
 
103
102
 
@@ -106,7 +105,7 @@ class ReportResult:
106
105
  """Output of the report-generation stage."""
107
106
 
108
107
  generated_reports: list[str]
109
- dora_metrics: Optional[dict[str, Any]]
108
+ dora_metrics: dict[str, Any] | None
110
109
  pr_metrics: dict[str, Any]
111
110
 
112
111
 
@@ -228,7 +227,7 @@ def calculate_date_range(weeks: int) -> DateRangeResult:
228
227
  def discover_repositories(
229
228
  cfg: Any,
230
229
  config_path: Path,
231
- progress_callback: Optional[Callable[[str, int], None]] = None,
230
+ progress_callback: Callable[[str, int], None] | None = None,
232
231
  ) -> list[Any]:
233
232
  """Discover repositories from a GitHub organisation if configured.
234
233
 
@@ -262,8 +261,8 @@ def fetch_repositories_batch(
262
261
  weeks: int,
263
262
  config_hash: str,
264
263
  force_fetch: bool,
265
- progress_callback: Optional[Callable[[str], None]] = None,
266
- repo_progress_callback: Optional[Callable[[str, str, dict[str, Any]], None]] = None,
264
+ progress_callback: Callable[[str], None] | None = None,
265
+ repo_progress_callback: Callable[[str, str, dict[str, Any]], None] | None = None,
267
266
  ) -> FetchResult:
268
267
  """Fetch raw git data for all repositories that need analysis.
269
268
 
@@ -281,6 +280,7 @@ def fetch_repositories_batch(
281
280
  ),
282
281
  exclude_paths=getattr(cfg.analysis, "exclude_paths", None),
283
282
  exclude_merge_commits=cfg.analysis.exclude_merge_commits,
283
+ ticket_detection_config=getattr(cfg.analysis, "ticket_detection", None),
284
284
  )
285
285
 
286
286
  orchestrator = IntegrationOrchestrator(cfg, cache)
@@ -335,7 +335,7 @@ def fetch_repositories_batch(
335
335
  logger.warning("Repository not found: %s", repo_path)
336
336
  continue
337
337
 
338
- branch_patterns: Optional[list[str]] = None
338
+ branch_patterns: list[str] | None = None
339
339
  if hasattr(cfg.analysis, "branch_patterns"):
340
340
  branch_patterns = cfg.analysis.branch_patterns
341
341
  elif cfg.github.organization:
@@ -538,9 +538,7 @@ def classify_commits_batch(
538
538
  fallback_enabled=True,
539
539
  )
540
540
 
541
- project_keys = [
542
- repo.project_key or repo.name for repo in repositories
543
- ]
541
+ project_keys = [repo.project_key or repo.name for repo in repositories]
544
542
 
545
543
  result = batch_classifier.classify_date_range(
546
544
  start_date=start_date,
@@ -578,9 +576,7 @@ def load_commits_from_db(
578
576
  and_(
579
577
  CachedCommit.timestamp >= start_date,
580
578
  CachedCommit.timestamp <= end_date,
581
- CachedCommit.repo_path.in_(
582
- [str(Path(repo.path)) for repo in repositories]
583
- ),
579
+ CachedCommit.repo_path.in_([str(Path(repo.path)) for repo in repositories]),
584
580
  )
585
581
  )
586
582
  .order_by(CachedCommit.timestamp.desc())
@@ -594,9 +590,7 @@ def load_commits_from_db(
594
590
  repo_path = Path(cc.repo_path)
595
591
  for repo_config in repositories:
596
592
  if repo_config.path == repo_path:
597
- commit_dict["project_key"] = (
598
- repo_config.project_key or repo_config.name
599
- )
593
+ commit_dict["project_key"] = repo_config.project_key or repo_config.name
600
594
  break
601
595
  else:
602
596
  commit_dict["project_key"] = repo_path.name
@@ -623,9 +617,7 @@ def resolve_developer_identities(
623
617
  ) -> IdentityResult:
624
618
  """Update identity resolver with commit stats and compute developer stats."""
625
619
  identity_resolver.update_commit_stats(all_commits)
626
- developer_ticket_coverage = ticket_extractor.calculate_developer_ticket_coverage(
627
- all_commits
628
- )
620
+ developer_ticket_coverage = ticket_extractor.calculate_developer_ticket_coverage(all_commits)
629
621
  developer_stats = identity_resolver.get_developer_stats(
630
622
  ticket_coverage=developer_ticket_coverage
631
623
  )
@@ -693,9 +685,7 @@ def analyze_tickets_and_store_metrics(
693
685
  elif isinstance(commit_date, str):
694
686
  from datetime import datetime as dt
695
687
 
696
- commit_date = dt.fromisoformat(
697
- commit_date.replace("Z", "+00:00")
698
- ).date()
688
+ commit_date = dt.fromisoformat(commit_date.replace("Z", "+00:00")).date()
699
689
  daily_commits.setdefault(commit_date, []).append(commit)
700
690
 
701
691
  total_records = 0
@@ -721,7 +711,6 @@ def analyze_tickets_and_store_metrics(
721
711
  # ---------------------------------------------------------------------------
722
712
 
723
713
 
724
-
725
714
  # Backward-compatible re-exports from reports sub-module
726
715
  from .analyze_pipeline_reports import ( # noqa: E402
727
716
  aggregate_pm_data,
@@ -730,12 +719,26 @@ from .analyze_pipeline_reports import ( # noqa: E402
730
719
  )
731
720
 
732
721
  __all__ = [
733
- "load_and_validate_config", "check_github_auth", "calculate_date_range",
734
- "discover_repositories", "fetch_repositories_batch", "validate_batch_state",
735
- "classify_commits_batch", "load_commits_from_db", "resolve_developer_identities",
736
- "analyze_tickets_and_store_metrics", "run_qualitative_analysis",
737
- "aggregate_pm_data", "generate_all_reports",
738
- "ConfigResult", "DateRangeResult", "FetchResult", "ClassificationResult",
739
- "CommitLoadResult", "IdentityResult", "TicketResult",
740
- "QualitativeResult", "ReportResult",
722
+ "load_and_validate_config",
723
+ "check_github_auth",
724
+ "calculate_date_range",
725
+ "discover_repositories",
726
+ "fetch_repositories_batch",
727
+ "validate_batch_state",
728
+ "classify_commits_batch",
729
+ "load_commits_from_db",
730
+ "resolve_developer_identities",
731
+ "analyze_tickets_and_store_metrics",
732
+ "run_qualitative_analysis",
733
+ "aggregate_pm_data",
734
+ "generate_all_reports",
735
+ "ConfigResult",
736
+ "DateRangeResult",
737
+ "FetchResult",
738
+ "ClassificationResult",
739
+ "CommitLoadResult",
740
+ "IdentityResult",
741
+ "TicketResult",
742
+ "QualitativeResult",
743
+ "ReportResult",
741
744
  ]
@@ -6,42 +6,34 @@ without performing any LLM-based classification.
6
6
  """
7
7
 
8
8
  import logging
9
- import os
10
- import subprocess
11
9
  import threading
12
- import time
13
- from concurrent.futures import ThreadPoolExecutor, as_completed
14
10
  from datetime import datetime, timedelta, timezone
15
11
  from pathlib import Path
16
- from typing import Any, Optional
12
+ from typing import TYPE_CHECKING, Any, Optional
17
13
 
18
- import git
19
- from sqlalchemy import case, func
20
- from sqlalchemy.orm import Session
14
+ from sqlalchemy import func
21
15
 
22
16
  from ..constants import BatchSizes, Timeouts
23
17
  from ..integrations.jira_integration import JIRAIntegration
24
18
  from ..models.database import (
25
- CachedCommit,
26
- CommitTicketCorrelation,
27
19
  DailyCommitBatch,
28
- DetailedTicketData,
29
20
  )
30
- from ..types import CommitStats
31
- from ..utils.commit_utils import is_merge_commit
32
- from ..utils.glob_matcher import match_recursive_pattern as _match_recursive_pattern_fn
33
- from ..utils.glob_matcher import matches_glob_pattern as _matches_glob_pattern_fn
34
- from ..utils.glob_matcher import should_exclude_file as _should_exclude_file_fn
35
21
  from .analysis_components import (
36
22
  build_branch_mapper,
37
23
  build_story_point_extractor,
38
24
  build_ticket_extractor,
39
25
  )
40
26
  from .cache import GitAnalysisCache
41
- from .git_timeout_wrapper import GitOperationTimeout, GitTimeoutWrapper, HeartbeatLogger
27
+ from .data_fetcher_git import GitFetcherMixin
28
+ from .data_fetcher_parallel import ParallelFetcherMixin
29
+ from .data_fetcher_processing import ProcessingMixin
30
+ from .git_timeout_wrapper import GitTimeoutWrapper
42
31
  from .identity import DeveloperIdentityResolver
43
32
  from .progress import get_progress_service
44
33
 
34
+ if TYPE_CHECKING:
35
+ from ..config.schema import TicketDetectionConfig
36
+
45
37
  logger = logging.getLogger(__name__)
46
38
 
47
39
  # THREAD SAFETY: Module-level thread-local storage for repository instances
@@ -50,11 +42,6 @@ logger = logging.getLogger(__name__)
50
42
  _thread_local = threading.local()
51
43
 
52
44
 
53
- from .data_fetcher_git import GitFetcherMixin
54
- from .data_fetcher_processing import ProcessingMixin
55
- from .data_fetcher_parallel import ParallelFetcherMixin
56
-
57
-
58
45
  class GitDataFetcher(GitFetcherMixin, ProcessingMixin, ParallelFetcherMixin):
59
46
  """Fetches raw Git commit data and organizes it by day for efficient batch processing.
60
47
 
@@ -74,6 +61,7 @@ class GitDataFetcher(GitFetcherMixin, ProcessingMixin, ParallelFetcherMixin):
74
61
  exclude_paths: Optional[list[str]] = None,
75
62
  skip_remote_fetch: bool = False,
76
63
  exclude_merge_commits: bool = False,
64
+ ticket_detection_config: Optional["TicketDetectionConfig"] = None,
77
65
  ) -> None:
78
66
  """Initialize the data fetcher.
79
67
 
@@ -84,6 +72,7 @@ class GitDataFetcher(GitFetcherMixin, ProcessingMixin, ParallelFetcherMixin):
84
72
  exclude_paths: List of file paths to exclude from analysis
85
73
  skip_remote_fetch: If True, skip git fetch/pull operations
86
74
  exclude_merge_commits: Exclude merge commits from filtered line count calculations
75
+ ticket_detection_config: Optional configurable ticket detection settings.
87
76
  """
88
77
  self.cache = cache
89
78
  self.skip_remote_fetch = skip_remote_fetch
@@ -92,7 +81,10 @@ class GitDataFetcher(GitFetcherMixin, ProcessingMixin, ParallelFetcherMixin):
92
81
  # CRITICAL FIX: Use the same database instance as the cache to avoid session conflicts
93
82
  self.database = cache.db
94
83
  self.story_point_extractor = build_story_point_extractor()
95
- self.ticket_extractor = build_ticket_extractor(allowed_platforms=allowed_ticket_platforms)
84
+ self.ticket_extractor = build_ticket_extractor(
85
+ allowed_platforms=allowed_ticket_platforms,
86
+ ticket_detection_config=ticket_detection_config,
87
+ )
96
88
  self.branch_mapper = build_branch_mapper(branch_mapping_rules)
97
89
  self.exclude_paths = exclude_paths or []
98
90
 
@@ -485,4 +477,3 @@ class GitDataFetcher(GitFetcherMixin, ProcessingMixin, ParallelFetcherMixin):
485
477
  return 0
486
478
  finally:
487
479
  session.close()
488
-
@@ -23,7 +23,6 @@ PERFORMANCE: Designed to handle large repositories efficiently with:
23
23
 
24
24
  import logging
25
25
  import time
26
- from collections import defaultdict
27
26
  from pathlib import Path
28
27
  from typing import Any, Optional
29
28
 
@@ -78,6 +77,7 @@ class MLTicketExtractor(MLTicketAnalysisMixin, TicketExtractor):
78
77
  cache_dir: Optional[Path] = None,
79
78
  enable_ml: bool = True,
80
79
  enable_llm: bool = False,
80
+ ticket_detection_config: Optional[Any] = None,
81
81
  ) -> None:
82
82
  """Initialize ML-enhanced ticket extractor.
83
83
 
@@ -89,9 +89,12 @@ class MLTicketExtractor(MLTicketAnalysisMixin, TicketExtractor):
89
89
  cache_dir: Directory for caching ML predictions
90
90
  enable_ml: Whether to enable ML features (fallback to rule-based if False)
91
91
  enable_llm: Whether to enable LLM classification (fallback to ML/rules if False)
92
+ ticket_detection_config: Optional TicketDetectionConfig passed through to
93
+ the base TicketExtractor for commit filtering,
94
+ position anchoring, and exclude-pattern filtering.
92
95
  """
93
- # Initialize parent class
94
- super().__init__(allowed_platforms, untracked_file_threshold)
96
+ # Initialize parent class (passes ticket_detection_config through)
97
+ super().__init__(allowed_platforms, untracked_file_threshold, ticket_detection_config)
95
98
 
96
99
  self.enable_ml = enable_ml and SPACY_AVAILABLE
97
100
  self.enable_llm = enable_llm
@@ -672,4 +675,3 @@ class MLTicketExtractor(MLTicketAnalysisMixin, TicketExtractor):
672
675
  }
673
676
 
674
677
  return mapping.get(ml_category, "other")
675
-
@@ -4,9 +4,15 @@ Core extraction and categorization live here. Coverage analysis and untracked-
4
4
  commit pattern analysis live in tickets_analysis.py (TicketAnalysisMixin).
5
5
  """
6
6
 
7
+ from __future__ import annotations
8
+
7
9
  import logging
8
10
  import re
9
- from typing import Any, Optional
11
+ from collections import defaultdict
12
+ from typing import TYPE_CHECKING, Any
13
+
14
+ if TYPE_CHECKING:
15
+ from ..config.schema import TicketDetectionConfig
10
16
 
11
17
  logger = logging.getLogger(__name__)
12
18
 
@@ -101,7 +107,10 @@ class TicketExtractor(TicketAnalysisMixin):
101
107
  """
102
108
 
103
109
  def __init__(
104
- self, allowed_platforms: Optional[list[str]] = None, untracked_file_threshold: int = 1
110
+ self,
111
+ allowed_platforms: list[str] | None = None,
112
+ untracked_file_threshold: int = 1,
113
+ ticket_detection_config: TicketDetectionConfig | None = None,
105
114
  ) -> None:
106
115
  """Initialize with patterns for different platforms.
107
116
 
@@ -111,10 +120,46 @@ class TicketExtractor(TicketAnalysisMixin):
111
120
  untracked_file_threshold: Minimum number of files changed to consider
112
121
  a commit as 'significant' for untracked analysis.
113
122
  Default is 1 (all commits), previously was 3.
123
+ ticket_detection_config: Optional configurable detection settings.
124
+ When None the extractor uses backward-compatible
125
+ defaults (all commits, full-message scan, no excludes).
114
126
  """
115
127
  self.allowed_platforms = allowed_platforms
116
128
  self.untracked_file_threshold = untracked_file_threshold
117
- self.patterns = {
129
+
130
+ # Store detection config (may be None – all code below handles that gracefully)
131
+ self._detection_config = ticket_detection_config
132
+
133
+ # Build commit_filter / target_branches / position from config or defaults
134
+ self._commit_filter: str = (
135
+ ticket_detection_config.commit_filter if ticket_detection_config else "all"
136
+ )
137
+ self._target_branches: list[str] = (
138
+ list(ticket_detection_config.target_branches)
139
+ if ticket_detection_config
140
+ else ["develop", "main", "master"]
141
+ )
142
+ self._position: str = (
143
+ ticket_detection_config.position if ticket_detection_config else "anywhere"
144
+ )
145
+
146
+ # Compile exclude patterns (post-extraction filter)
147
+ raw_excludes: list[str] = (
148
+ list(ticket_detection_config.exclude_patterns) if ticket_detection_config else []
149
+ )
150
+ self._compiled_excludes: list[re.Pattern[str]] = [re.compile(p) for p in raw_excludes]
151
+
152
+ # If config supplies custom per-platform patterns, use them; otherwise fall back
153
+ # to the built-in defaults. The config patterns dict maps platform -> single
154
+ # pattern string; the built-in defaults use lists.
155
+ config_patterns: dict[str, str] = (
156
+ dict(ticket_detection_config.patterns)
157
+ if ticket_detection_config and ticket_detection_config.patterns
158
+ else {}
159
+ )
160
+
161
+ # Built-in defaults (always present as fallback)
162
+ default_patterns: dict[str, list[str]] = {
118
163
  "jira": [
119
164
  r"([A-Z]{2,10}-\d+)", # Standard JIRA format: PROJ-123
120
165
  ],
@@ -133,16 +178,26 @@ class TicketExtractor(TicketAnalysisMixin):
133
178
  ],
134
179
  }
135
180
 
181
+ # Merge: config patterns override defaults for their platform
182
+ self.patterns: dict[str, list[str]] = {}
183
+ for platform, patterns in default_patterns.items():
184
+ if platform in config_patterns:
185
+ # Config supplies a single pattern string; wrap in a list
186
+ self.patterns[platform] = [config_patterns[platform]]
187
+ else:
188
+ self.patterns[platform] = list(patterns)
189
+
136
190
  # Compile patterns only for allowed platforms
137
- self.compiled_patterns = {}
191
+ self.compiled_patterns: dict[str, list[re.Pattern[str]]] = {}
138
192
  for platform, patterns in self.patterns.items():
139
193
  # Skip platforms not in allowed list
140
194
  if self.allowed_platforms and platform not in self.allowed_platforms:
141
195
  continue
142
- self.compiled_patterns[platform] = [
143
- re.compile(pattern, re.IGNORECASE if platform != "jira" else 0)
144
- for pattern in patterns
145
- ]
196
+ compiled: list[re.Pattern[str]] = []
197
+ for pattern in patterns:
198
+ anchored = f"^{pattern}" if self._position == "start" else pattern
199
+ compiled.append(re.compile(anchored, re.IGNORECASE if platform != "jira" else 0))
200
+ self.compiled_patterns[platform] = compiled
146
201
 
147
202
  # Commit categorization patterns
148
203
  self.category_patterns = {
@@ -368,8 +423,72 @@ class TicketExtractor(TicketAnalysisMixin):
368
423
  re.compile(pattern, re.IGNORECASE) for pattern in patterns
369
424
  ]
370
425
 
426
+ def should_skip_commit(self, commit: Any) -> bool:
427
+ """Decide whether a commit should be skipped during ticket extraction.
428
+
429
+ Uses the ``commit_filter`` setting from :class:`TicketDetectionConfig`.
430
+
431
+ * ``"all"`` – never skip (backward-compatible default).
432
+ * ``"squash_merges_only"`` – skip commits that are NOT squash merges.
433
+ Heuristic: a squash merge has exactly one parent AND is on a target
434
+ branch (or its branch metadata indicates so).
435
+ * ``"merge_commits"`` – skip commits that do NOT have >1 parent.
436
+
437
+ The *commit* argument is expected to be a dict with at least:
438
+ ``{"parents": [...], "branch": str}`` or a ``git.Commit`` object with
439
+ ``.parents`` and optionally a ``.branch`` attribute. If the commit
440
+ object does not expose branch information the filter degrades gracefully.
441
+
442
+ Args:
443
+ commit: A dict or object representing a single commit.
444
+
445
+ Returns:
446
+ True when the commit should be skipped, False when it should be
447
+ processed normally.
448
+ """
449
+ if self._commit_filter == "all":
450
+ return False
451
+
452
+ # Normalise: support both dict and object access
453
+ if isinstance(commit, dict):
454
+ parents = commit.get("parents", [])
455
+ branch = commit.get("branch", "")
456
+ else:
457
+ parents = getattr(commit, "parents", [])
458
+ branch = getattr(commit, "branch", "")
459
+
460
+ parent_count = len(parents)
461
+
462
+ if self._commit_filter == "squash_merges_only":
463
+ # A squash merge is a single-parent commit on an integration branch.
464
+ on_target = any(
465
+ branch == tb or (branch or "").endswith(f"/{tb}") for tb in self._target_branches
466
+ )
467
+ is_squash = parent_count == 1 and on_target
468
+ return not is_squash
469
+
470
+ if self._commit_filter == "merge_commits":
471
+ return parent_count <= 1
472
+
473
+ # Unknown filter value – default to not skipping
474
+ return False
475
+
476
+ def _is_excluded(self, ticket_id: str) -> bool:
477
+ """Return True if *ticket_id* matches any configured exclude pattern.
478
+
479
+ Args:
480
+ ticket_id: The raw ticket identifier string (e.g. ``"CVE-2026-1234"``).
481
+
482
+ Returns:
483
+ True when the ticket should be discarded.
484
+ """
485
+ return any(pattern.fullmatch(ticket_id) for pattern in self._compiled_excludes)
486
+
371
487
  def extract_from_text(self, text: str) -> list[dict[str, str]]:
372
- """Extract all ticket references from text."""
488
+ """Extract all ticket references from text.
489
+
490
+ Applies exclude-pattern filtering before returning results.
491
+ """
373
492
  if not text:
374
493
  return []
375
494
 
@@ -386,6 +505,11 @@ class TicketExtractor(TicketAnalysisMixin):
386
505
  if platform == "jira" or platform == "linear":
387
506
  ticket_id = ticket_id.upper()
388
507
 
508
+ # Post-extraction exclude-pattern filter
509
+ if self._is_excluded(ticket_id):
510
+ logger.debug("Discarding ticket %r: matches an exclude pattern", ticket_id)
511
+ continue
512
+
389
513
  # Create unique key
390
514
  key = f"{platform}:{ticket_id}"
391
515
  if key not in seen:
@@ -67,6 +67,7 @@ def run_collect(
67
67
  ),
68
68
  exclude_paths=getattr(cfg.analysis, "exclude_paths", None),
69
69
  exclude_merge_commits=cfg.analysis.exclude_merge_commits,
70
+ ticket_detection_config=getattr(cfg.analysis, "ticket_detection", None),
70
71
  )
71
72
  orchestrator = IntegrationOrchestrator(cfg, cache)
72
73
  jira_integration = orchestrator.integrations.get("jira")