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