gitflow-analytics 3.13.5__tar.gz → 3.13.6__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 (287) hide show
  1. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/PKG-INFO +1 -1
  2. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/pyproject.toml +3 -0
  3. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/_version.py +1 -1
  4. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/cli.py +124 -0
  5. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/core/git_auth.py +74 -0
  6. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/core/git_timeout_wrapper.py +8 -0
  7. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics.egg-info/PKG-INFO +1 -1
  8. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_reports.py +0 -1
  9. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/CHANGELOG.md +0 -0
  10. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/CLAUDE.md +0 -0
  11. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/LICENSE +0 -0
  12. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/MANIFEST.in +0 -0
  13. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/README.md +0 -0
  14. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/DOCUMENTATION-STANDARDS.md +0 -0
  15. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/README.md +0 -0
  16. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/SECURITY.md +0 -0
  17. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/STRUCTURE.md +0 -0
  18. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/README.md +0 -0
  19. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/analysis-files/ewtn-critical-security-report.md +0 -0
  20. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_engineer_20250915_085239_236.md +0 -0
  21. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_engineer_20250915_114233_697.md +0 -0
  22. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_engineer_20250915_115330_511.md +0 -0
  23. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_engineer_20250915_120516_669.md +0 -0
  24. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_engineer_20250915_124906_951.md +0 -0
  25. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_engineer_20250915_175540_671.md +0 -0
  26. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_engineer_20250915_214023_300.md +0 -0
  27. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_engineer_20250916_130622_510.md +0 -0
  28. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_ops_20250915_123323_419.md +0 -0
  29. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_ops_20250915_134446_128.md +0 -0
  30. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_ops_20250915_184656_725.md +0 -0
  31. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_research_20250915_091233_023.md +0 -0
  32. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_research_20250915_100404_339.md +0 -0
  33. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/agent_research_20250915_110606_413.md +0 -0
  34. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/system_prompt_20250915_084833_641.md +0 -0
  35. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/system_prompt_20250915_090830_660.md +0 -0
  36. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-logs/prompts/system_prompt_20250916_130545_822.md +0 -0
  37. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-reports/output/database_qualitative_report_20250630_20250824.md +0 -0
  38. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-reports/output/narrative_report_20250630_20250824.md +0 -0
  39. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-reports/reports-24week/database_qualitative_report_20250303_20250817.md +0 -0
  40. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-reports/reports-24week/narrative_report_20250303_20250817.md +0 -0
  41. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-reports/test-ewtn-reports/narrative_report_20250810.md +0 -0
  42. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-reports/test-reports/database_qualitative_report_20250908_20250914.md +0 -0
  43. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-reports/test-reports/narrative_report_20250908_20250914.md +0 -0
  44. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-reports/test-weekly-reports/database_qualitative_report_20250623_20250817.md +0 -0
  45. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/old-reports/test-weekly-reports/narrative_report_20250623_20250817.md +0 -0
  46. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/CHANGELOG_INTERACTIVE_LAUNCHER.md +0 -0
  47. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/CLEANUP_SUMMARY-20250929.md +0 -0
  48. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/FEATURES_READY_FOR_TESTING.md +0 -0
  49. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/FIX_SUMMARY.md +0 -0
  50. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/IMPLEMENTATION_SUMMARY.md +0 -0
  51. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/PROGRESS_TRACKING_FIXES.md +0 -0
  52. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/PROJECT_CLEANUP_REPORT-20250929.md +0 -0
  53. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/README.md +0 -0
  54. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/STORY_POINTS_CONFIG_SUMMARY-archived.md +0 -0
  55. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/SYNTAX_ERROR_FIX.md +0 -0
  56. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/TEST_REPORT_GIT_CLONING.md +0 -0
  57. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/TIMEZONE_BUG_RESOLUTION.md +0 -0
  58. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/USAGE_EXAMPLES-archived.md +0 -0
  59. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/_archive/temp-files/code_analysis_report.md +0 -0
  60. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/architecture/README.md +0 -0
  61. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/architecture/branch-analysis-optimization.md +0 -0
  62. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/architecture/caching-strategy.md +0 -0
  63. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/architecture/llm-classifier-refactoring.md +0 -0
  64. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/architecture/ml-pipeline.md +0 -0
  65. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/configuration/configuration.md +0 -0
  66. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/deployment/README.md +0 -0
  67. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/design/README.md +0 -0
  68. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/design/circuit-breaker-implementation.md +0 -0
  69. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/design/commit-classification-design.md +0 -0
  70. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/design/git_pm_correlation_design.md +0 -0
  71. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/design/platform-agnostic-pm-framework.md +0 -0
  72. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/design/qualitative_data_extraction.md +0 -0
  73. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/developer/README.md +0 -0
  74. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/developer/contributing.md +0 -0
  75. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/developer/development-setup.md +0 -0
  76. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/developer/project-organization.md +0 -0
  77. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/developer/refactoring-guide.md +0 -0
  78. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/developer/training-guide.md +0 -0
  79. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/examples/README.md +0 -0
  80. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/examples/interactive-launcher-examples.md +0 -0
  81. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/examples/story-points-configuration.md +0 -0
  82. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/getting-started/README.md +0 -0
  83. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/getting-started/first-analysis.md +0 -0
  84. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/getting-started/installation.md +0 -0
  85. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/getting-started/quickstart.md +0 -0
  86. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/guides/LLM_CLASSIFICATION_GUIDE.md +0 -0
  87. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/guides/README.md +0 -0
  88. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/guides/chatgpt-setup.md +0 -0
  89. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/guides/identity-resolution-enhanced.md +0 -0
  90. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/guides/interactive-launcher.md +0 -0
  91. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/guides/managing-aliases.md +0 -0
  92. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/guides/ml-categorization.md +0 -0
  93. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/guides/pm-platform-setup.md +0 -0
  94. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/guides/troubleshooting.md +0 -0
  95. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/quick-reference/launcher-and-identity.md +0 -0
  96. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/reference/README.md +0 -0
  97. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/reference/cache-system.md +0 -0
  98. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/reference/cli-commands.md +0 -0
  99. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/reference/configuration-schema.md +0 -0
  100. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/docs/reference/json-export-schema.md +0 -0
  101. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/setup.cfg +0 -0
  102. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/__init__.py +0 -0
  103. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/classification/__init__.py +0 -0
  104. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/classification/batch_classifier.py +0 -0
  105. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/classification/classifier.py +0 -0
  106. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/classification/feature_extractor.py +0 -0
  107. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/classification/linguist_analyzer.py +0 -0
  108. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/classification/model.py +0 -0
  109. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/cli_wizards/__init__.py +0 -0
  110. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/cli_wizards/install_wizard.py +0 -0
  111. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/cli_wizards/menu.py +0 -0
  112. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/cli_wizards/run_launcher.py +0 -0
  113. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/config/__init__.py +0 -0
  114. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/config/aliases.py +0 -0
  115. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/config/errors.py +0 -0
  116. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/config/loader.py +0 -0
  117. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/config/profiles.py +0 -0
  118. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/config/repository.py +0 -0
  119. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/config/schema.py +0 -0
  120. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/config/validator.py +0 -0
  121. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/config.py +0 -0
  122. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/constants.py +0 -0
  123. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/core/__init__.py +0 -0
  124. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/core/analyzer.py +0 -0
  125. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/core/branch_mapper.py +0 -0
  126. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/core/cache.py +0 -0
  127. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/core/data_fetcher.py +0 -0
  128. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/core/identity.py +0 -0
  129. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/core/metrics_storage.py +0 -0
  130. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/core/progress.py +0 -0
  131. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/core/schema_version.py +0 -0
  132. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/core/subprocess_git.py +0 -0
  133. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/extractors/__init__.py +0 -0
  134. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/extractors/base.py +0 -0
  135. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/extractors/ml_tickets.py +0 -0
  136. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/extractors/story_points.py +0 -0
  137. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/extractors/tickets.py +0 -0
  138. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/identity_llm/__init__.py +0 -0
  139. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/identity_llm/analysis_pass.py +0 -0
  140. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/identity_llm/analyzer.py +0 -0
  141. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/identity_llm/models.py +0 -0
  142. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/integrations/__init__.py +0 -0
  143. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/integrations/github_integration.py +0 -0
  144. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/integrations/jira_integration.py +0 -0
  145. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/integrations/orchestrator.py +0 -0
  146. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/metrics/__init__.py +0 -0
  147. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/metrics/activity_scoring.py +0 -0
  148. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/metrics/branch_health.py +0 -0
  149. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/metrics/dora.py +0 -0
  150. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/models/__init__.py +0 -0
  151. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/models/database.py +0 -0
  152. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/pm_framework/__init__.py +0 -0
  153. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/pm_framework/adapters/__init__.py +0 -0
  154. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/pm_framework/adapters/jira_adapter.py +0 -0
  155. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/pm_framework/base.py +0 -0
  156. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/pm_framework/models.py +0 -0
  157. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/pm_framework/orchestrator.py +0 -0
  158. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/pm_framework/registry.py +0 -0
  159. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/__init__.py +0 -0
  160. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/chatgpt_analyzer.py +0 -0
  161. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/__init__.py +0 -0
  162. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/change_type.py +0 -0
  163. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/domain_classifier.py +0 -0
  164. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/intent_analyzer.py +0 -0
  165. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/llm/__init__.py +0 -0
  166. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/llm/base.py +0 -0
  167. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/llm/batch_processor.py +0 -0
  168. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/llm/cache.py +0 -0
  169. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/llm/cost_tracker.py +0 -0
  170. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/llm/openai_client.py +0 -0
  171. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/llm/prompts.py +0 -0
  172. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/llm/response_parser.py +0 -0
  173. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/llm_commit_classifier.py +0 -0
  174. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/classifiers/risk_analyzer.py +0 -0
  175. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/core/__init__.py +0 -0
  176. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/core/llm_fallback.py +0 -0
  177. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/core/nlp_engine.py +0 -0
  178. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/core/pattern_cache.py +0 -0
  179. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/core/processor.py +0 -0
  180. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/enhanced_analyzer.py +0 -0
  181. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/example_enhanced_usage.py +0 -0
  182. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/models/__init__.py +0 -0
  183. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/models/schemas.py +0 -0
  184. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/utils/__init__.py +0 -0
  185. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/utils/batch_processor.py +0 -0
  186. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/utils/cost_tracker.py +0 -0
  187. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/utils/metrics.py +0 -0
  188. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/qualitative/utils/text_processing.py +0 -0
  189. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/__init__.py +0 -0
  190. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/analytics_writer.py +0 -0
  191. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/base.py +0 -0
  192. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/branch_health_writer.py +0 -0
  193. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/classification_writer.py +0 -0
  194. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/cli_integration.py +0 -0
  195. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/csv_writer.py +0 -0
  196. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/data_models.py +0 -0
  197. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/database_report_generator.py +0 -0
  198. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/example_usage.py +0 -0
  199. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/factory.py +0 -0
  200. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/formatters.py +0 -0
  201. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/html_generator.py +0 -0
  202. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/interfaces.py +0 -0
  203. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/json_exporter.py +0 -0
  204. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/narrative_writer.py +0 -0
  205. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/story_point_correlation.py +0 -0
  206. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/reports/weekly_trends_writer.py +0 -0
  207. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/security/__init__.py +0 -0
  208. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/security/config.py +0 -0
  209. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/security/extractors/__init__.py +0 -0
  210. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/security/extractors/dependency_checker.py +0 -0
  211. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/security/extractors/secret_detector.py +0 -0
  212. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/security/extractors/vulnerability_scanner.py +0 -0
  213. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/security/llm_analyzer.py +0 -0
  214. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/security/reports/__init__.py +0 -0
  215. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/security/reports/security_report.py +0 -0
  216. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/security/security_analyzer.py +0 -0
  217. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/training/__init__.py +0 -0
  218. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/training/model_loader.py +0 -0
  219. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/training/pipeline.py +0 -0
  220. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/types/__init__.py +0 -0
  221. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/types/commit_types.py +0 -0
  222. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/ui/__init__.py +0 -0
  223. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/ui/progress_display.py +0 -0
  224. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/utils/__init__.py +0 -0
  225. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/utils/commit_utils.py +0 -0
  226. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics/verify_activity.py +0 -0
  227. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics.egg-info/SOURCES.txt +0 -0
  228. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics.egg-info/dependency_links.txt +0 -0
  229. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics.egg-info/entry_points.txt +0 -0
  230. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics.egg-info/requires.txt +0 -0
  231. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/src/gitflow_analytics.egg-info/top_level.txt +0 -0
  232. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/__init__.py +0 -0
  233. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/conftest.py +0 -0
  234. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/core/__init__.py +0 -0
  235. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/core/test_analyzer.py +0 -0
  236. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/core/test_analyzer_merge_stats.py +0 -0
  237. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/core/test_cache.py +0 -0
  238. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/core/test_data_fetcher.py +0 -0
  239. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/core/test_data_fetcher_merge_stats.py +0 -0
  240. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/core/test_identity.py +0 -0
  241. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/core/test_merge_commit_detection.py +0 -0
  242. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/core/test_progress.py +0 -0
  243. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/debug_bulk_exists.py +0 -0
  244. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/debug_commit_story_points.py +0 -0
  245. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/debug_database_storage.py +0 -0
  246. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/debug_jira_enrichment.py +0 -0
  247. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/debug_story_points.py +0 -0
  248. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/extractors/__init__.py +0 -0
  249. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/integration/__init__.py +0 -0
  250. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/integration/conftest.py +0 -0
  251. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/integration/test_merge_exclusion_workflow.py +0 -0
  252. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/integrations/__init__.py +0 -0
  253. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/metrics/__init__.py +0 -0
  254. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/models/__init__.py +0 -0
  255. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/qualitative/__init__.py +0 -0
  256. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/qualitative/test_basic_integration.py +0 -0
  257. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/reports/__init__.py +0 -0
  258. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/run_all_tests.py +0 -0
  259. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/run_security_all_repos.py +0 -0
  260. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/run_security_analysis.py +0 -0
  261. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test-qa-install/test_error_handling.py +0 -0
  262. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test-qa-install/test_wizard_automated.py +0 -0
  263. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_atomic_caching.py +0 -0
  264. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_cache_invalidation.py +0 -0
  265. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_classification_system.py +0 -0
  266. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_cli.py +0 -0
  267. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_cli_wizards/__init__.py +0 -0
  268. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_cli_wizards/test_menu.py +0 -0
  269. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_config.py +0 -0
  270. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_config_extends.py +0 -0
  271. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_config_profiles.py +0 -0
  272. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_config_story_points.py +0 -0
  273. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_jira_connection.py +0 -0
  274. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_llm_commit_classification.py +0 -0
  275. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_march_2025_comparison.py +0 -0
  276. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_metrics.py +0 -0
  277. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_ml_accuracy.py +0 -0
  278. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_ml_components.py +0 -0
  279. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_ml_comprehensive.py +0 -0
  280. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_ml_integration.py +0 -0
  281. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_pm_env_resolution.py +0 -0
  282. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_report_abstraction.py +0 -0
  283. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_story_points_analysis.py +0 -0
  284. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_training_pipeline.py +0 -0
  285. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/test_two_step_process.py +0 -0
  286. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/tests/utils/__init__.py +0 -0
  287. {gitflow_analytics-3.13.5 → gitflow_analytics-3.13.6}/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.5
3
+ Version: 3.13.6
4
4
  Summary: Analyze Git repositories for developer productivity insights
5
5
  Author-email: Bob Matyas <bobmatnyc@gmail.com>
6
6
  License: MIT
@@ -96,6 +96,9 @@ target-version = "py39"
96
96
  select = ["E", "F", "UP", "B", "SIM", "I"]
97
97
  ignore = ["E501"] # Line too long - handled by formatter
98
98
 
99
+ [tool.ruff.lint.per-file-ignores]
100
+ "tests/**/*.py" = ["E402", "E722", "F401", "SIM102"] # Allow test-specific patterns
101
+
99
102
  [tool.black]
100
103
  line-length = 100
101
104
  target-version = ['py39']
@@ -1,4 +1,4 @@
1
1
  """Version information for gitflow-analytics."""
2
2
 
3
- __version__ = "3.13.5"
3
+ __version__ = "3.13.6"
4
4
  __version_info__ = tuple(int(x) for x in __version__.split("."))
@@ -1590,6 +1590,68 @@ def analyze(
1590
1590
  total_commits += result["stats"]["total_commits"]
1591
1591
  total_tickets += result["stats"]["unique_tickets"]
1592
1592
 
1593
+ # Fetch and enrich with GitHub PRs after data collection
1594
+ if repo_config.github_repo:
1595
+ try:
1596
+ if display:
1597
+ display.print_status(
1598
+ " 📥 Fetching pull requests from GitHub...",
1599
+ "info",
1600
+ )
1601
+
1602
+ # Load commits that were just fetched from cache
1603
+ with cache.get_session() as session:
1604
+ from gitflow_analytics.models.database import CachedCommit
1605
+
1606
+ cached_commits = (
1607
+ session.query(CachedCommit)
1608
+ .filter(
1609
+ CachedCommit.repo_path == str(repo_path),
1610
+ CachedCommit.timestamp >= start_date,
1611
+ CachedCommit.timestamp <= end_date,
1612
+ )
1613
+ .all()
1614
+ )
1615
+
1616
+ # Convert to dict format for enrichment
1617
+ commits_for_enrichment = []
1618
+ for cached_commit in cached_commits:
1619
+ commit_dict = {
1620
+ "hash": cached_commit.commit_hash,
1621
+ "author_name": cached_commit.author_name,
1622
+ "author_email": cached_commit.author_email,
1623
+ "date": cached_commit.timestamp,
1624
+ "message": cached_commit.message,
1625
+ }
1626
+ commits_for_enrichment.append(commit_dict)
1627
+
1628
+ # Enrich with GitHub PR data
1629
+ enrichment = orchestrator.enrich_repository_data(
1630
+ repo_config, commits_for_enrichment, start_date
1631
+ )
1632
+
1633
+ if enrichment["prs"]:
1634
+ pr_count = len(enrichment["prs"])
1635
+ if display:
1636
+ display.print_status(
1637
+ f" ✅ Found {pr_count} pull requests",
1638
+ "success",
1639
+ )
1640
+ else:
1641
+ click.echo(f" ✅ Found {pr_count} pull requests")
1642
+
1643
+ except Exception as e:
1644
+ logger.warning(
1645
+ f"Failed to fetch PRs for {repo_config.github_repo}: {e}"
1646
+ )
1647
+ if display:
1648
+ display.print_status(
1649
+ f" ⚠️ Could not fetch PRs: {e}",
1650
+ "warning",
1651
+ )
1652
+ else:
1653
+ click.echo(f" ⚠️ Could not fetch PRs: {e}")
1654
+
1593
1655
  # Collect unique developers if available
1594
1656
  if "developers" in result["stats"]:
1595
1657
  total_developers.update(result["stats"]["developers"])
@@ -2088,6 +2150,68 @@ def analyze(
2088
2150
  total_commits += result["stats"]["total_commits"]
2089
2151
  total_tickets += result["stats"]["unique_tickets"]
2090
2152
 
2153
+ # Fetch and enrich with GitHub PRs after data collection
2154
+ if repo_config.github_repo:
2155
+ try:
2156
+ if display:
2157
+ display.print_status(
2158
+ " 📥 Fetching pull requests from GitHub...",
2159
+ "info",
2160
+ )
2161
+
2162
+ # Load commits that were just fetched from cache
2163
+ with cache.get_session() as session:
2164
+ from gitflow_analytics.models.database import CachedCommit
2165
+
2166
+ cached_commits = (
2167
+ session.query(CachedCommit)
2168
+ .filter(
2169
+ CachedCommit.repo_path == str(repo_path),
2170
+ CachedCommit.timestamp >= start_date,
2171
+ CachedCommit.timestamp <= end_date,
2172
+ )
2173
+ .all()
2174
+ )
2175
+
2176
+ # Convert to dict format for enrichment
2177
+ commits_for_enrichment = []
2178
+ for cached_commit in cached_commits:
2179
+ commit_dict = {
2180
+ "hash": cached_commit.commit_hash,
2181
+ "author_name": cached_commit.author_name,
2182
+ "author_email": cached_commit.author_email,
2183
+ "date": cached_commit.timestamp,
2184
+ "message": cached_commit.message,
2185
+ }
2186
+ commits_for_enrichment.append(commit_dict)
2187
+
2188
+ # Enrich with GitHub PR data
2189
+ enrichment = orchestrator.enrich_repository_data(
2190
+ repo_config, commits_for_enrichment, start_date
2191
+ )
2192
+
2193
+ if enrichment["prs"]:
2194
+ pr_count = len(enrichment["prs"])
2195
+ if display:
2196
+ display.print_status(
2197
+ f" ✅ Found {pr_count} pull requests",
2198
+ "success",
2199
+ )
2200
+ else:
2201
+ click.echo(f" ✅ Found {pr_count} pull requests")
2202
+
2203
+ except Exception as e:
2204
+ logger.warning(
2205
+ f"Failed to fetch PRs for {repo_config.github_repo}: {e}"
2206
+ )
2207
+ if display:
2208
+ display.print_status(
2209
+ f" ⚠️ Could not fetch PRs: {e}",
2210
+ "warning",
2211
+ )
2212
+ else:
2213
+ click.echo(f" ⚠️ Could not fetch PRs: {e}")
2214
+
2091
2215
  # Collect unique developers if available
2092
2216
  if "developers" in result["stats"]:
2093
2217
  total_developers.update(result["stats"]["developers"])
@@ -112,6 +112,80 @@ def setup_git_credentials(token: str, username: str = "git") -> bool:
112
112
  return False
113
113
 
114
114
 
115
+ def ensure_remote_url_has_token(repo_path: Path, token: str) -> bool:
116
+ """Embed GitHub token in remote URL for HTTPS authentication.
117
+
118
+ This is needed because subprocess git operations may not have access
119
+ to the credential helper store due to environment variable restrictions
120
+ (GIT_CREDENTIAL_HELPER="" and GIT_ASKPASS="/bin/echo" in git_timeout_wrapper).
121
+
122
+ Args:
123
+ repo_path: Path to the git repository
124
+ token: GitHub personal access token
125
+
126
+ Returns:
127
+ True if URL was updated with token, False if already has token,
128
+ not applicable (SSH URL), or operation failed
129
+ """
130
+ if not token:
131
+ logger.debug("No token provided, skipping remote URL update")
132
+ return False
133
+
134
+ try:
135
+ # Get current origin remote URL
136
+ result = subprocess.run(
137
+ ["git", "remote", "get-url", "origin"],
138
+ cwd=repo_path,
139
+ capture_output=True,
140
+ text=True,
141
+ check=True,
142
+ )
143
+ current_url = result.stdout.strip()
144
+
145
+ if not current_url:
146
+ logger.debug(f"No origin remote found for {repo_path}")
147
+ return False
148
+
149
+ # Check if it's an HTTPS GitHub URL without embedded token
150
+ if current_url.startswith("https://github.com/"):
151
+ # URL format: https://github.com/org/repo.git
152
+ # New format: https://git:TOKEN@github.com/org/repo.git
153
+ new_url = current_url.replace("https://github.com/", f"https://git:{token}@github.com/")
154
+
155
+ # Update the remote URL
156
+ subprocess.run(
157
+ ["git", "remote", "set-url", "origin", new_url],
158
+ cwd=repo_path,
159
+ capture_output=True,
160
+ text=True,
161
+ check=True,
162
+ )
163
+ logger.debug(f"Updated remote URL with embedded token for {repo_path.name}")
164
+ return True
165
+
166
+ elif "@github.com" in current_url:
167
+ # Already has authentication embedded (either token or SSH)
168
+ logger.debug(f"Remote URL already has authentication for {repo_path.name}")
169
+ return False
170
+
171
+ elif current_url.startswith("git@github.com:"):
172
+ # SSH URL, no need to modify
173
+ logger.debug(f"Using SSH authentication for {repo_path.name}")
174
+ return False
175
+
176
+ else:
177
+ # Unknown URL format
178
+ logger.debug(f"Unknown URL format for {repo_path.name}: {current_url}")
179
+ return False
180
+
181
+ except subprocess.CalledProcessError as e:
182
+ logger.warning(f"Could not update remote URL for {repo_path.name}: {e.stderr}")
183
+ return False
184
+ except Exception as e:
185
+ logger.warning(f"Unexpected error updating remote URL for {repo_path.name}: {e}")
186
+ return False
187
+
188
+
115
189
  def preflight_git_authentication(config: dict) -> bool:
116
190
  """Run pre-flight checks for git authentication and setup credentials.
117
191
 
@@ -14,6 +14,7 @@ from pathlib import Path
14
14
  from typing import Callable, Optional, TypeVar
15
15
 
16
16
  from ..constants import Timeouts
17
+ from .git_auth import ensure_remote_url_has_token
17
18
 
18
19
  logger = logging.getLogger(__name__)
19
20
 
@@ -208,6 +209,13 @@ class GitTimeoutWrapper:
208
209
  True if fetch succeeded, False otherwise
209
210
  """
210
211
  try:
212
+ # Embed GitHub token in remote URL if available
213
+ # This is necessary because git operations run with GIT_CREDENTIAL_HELPER=""
214
+ # and GIT_ASKPASS="/bin/echo", which disable credential helpers
215
+ token = os.environ.get("GITHUB_TOKEN")
216
+ if token:
217
+ ensure_remote_url_has_token(repo_path, token)
218
+
211
219
  self.run_git_command(
212
220
  ["git", "fetch", "--all"], cwd=repo_path, timeout=timeout, check=True
213
221
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitflow-analytics
3
- Version: 3.13.5
3
+ Version: 3.13.6
4
4
  Summary: Analyze Git repositories for developer productivity insights
5
5
  Author-email: Bob Matyas <bobmatnyc@gmail.com>
6
6
  License: MIT
@@ -259,7 +259,6 @@ class TestNarrativeReportGenerator:
259
259
 
260
260
  pr_metrics = {"avg_pr_size": 150, "total_prs": 10}
261
261
 
262
-
263
262
  result_path = generator.generate_narrative_report(
264
263
  commits,
265
264
  prs,