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