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