gitflow-analytics 3.9.3__tar.gz → 3.10.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/PKG-INFO +1 -1
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/_version.py +1 -1
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/cli.py +28 -8
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/cli_wizards/install_wizard.py +243 -20
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/loader.py +15 -1
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/schema.py +1 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics.egg-info/PKG-INFO +1 -1
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/CHANGELOG.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/CLAUDE.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/LICENSE +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/MANIFEST.in +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/README.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/README.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/REFACTOR.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/SECURITY.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/STRUCTURE.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/_archive/temp-files/PROGRESS_TRACKING_FIXES.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/_archive/temp-files/SYNTAX_ERROR_FIX.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/architecture/README.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/architecture/branch-analysis-optimization.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/architecture/caching-strategy.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/architecture/llm-classifier-refactoring.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/architecture/ml-pipeline.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/configuration/configuration.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/deployment/README.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/design/README.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/design/circuit-breaker-implementation.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/design/commit-classification-design.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/design/git_pm_correlation_design.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/design/platform-agnostic-pm-framework.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/design/qualitative_data_extraction.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/developer/README.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/developer/contributing.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/developer/development-setup.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/developer/training-guide.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/examples/README.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/getting-started/README.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/getting-started/first-analysis.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/getting-started/installation.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/getting-started/quickstart.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/guides/README.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/guides/chatgpt-setup.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/guides/identity-resolution-enhanced.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/guides/interactive-launcher.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/guides/managing-aliases.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/guides/ml-categorization.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/guides/pm-platform-setup.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/guides/troubleshooting.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/quick-reference/launcher-and-identity.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/reference/README.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/reference/cache-system.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/reference/cli-commands.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/reference/configuration-schema.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/reference/json-export-schema.md +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/pyproject.toml +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/setup.cfg +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/classification/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/classification/batch_classifier.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/classification/classifier.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/classification/feature_extractor.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/classification/linguist_analyzer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/classification/model.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/cli_wizards/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/cli_wizards/run_launcher.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/aliases.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/errors.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/profiles.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/repository.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/validator.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/constants.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/analyzer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/branch_mapper.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/cache.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/data_fetcher.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/git_auth.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/git_timeout_wrapper.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/identity.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/metrics_storage.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/progress.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/schema_version.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/subprocess_git.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/extractors/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/extractors/base.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/extractors/ml_tickets.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/extractors/story_points.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/extractors/tickets.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/identity_llm/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/identity_llm/analysis_pass.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/identity_llm/analyzer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/identity_llm/models.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/integrations/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/integrations/github_integration.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/integrations/jira_integration.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/integrations/orchestrator.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/metrics/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/metrics/activity_scoring.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/metrics/branch_health.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/metrics/dora.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/models/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/models/database.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/pm_framework/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/pm_framework/adapters/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/pm_framework/adapters/jira_adapter.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/pm_framework/base.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/pm_framework/models.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/pm_framework/orchestrator.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/pm_framework/registry.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/chatgpt_analyzer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/change_type.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/domain_classifier.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/intent_analyzer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/llm/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/llm/base.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/llm/batch_processor.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/llm/cache.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/llm/cost_tracker.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/llm/openai_client.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/llm/prompts.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/llm/response_parser.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/llm_commit_classifier.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/classifiers/risk_analyzer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/core/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/core/llm_fallback.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/core/nlp_engine.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/core/pattern_cache.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/core/processor.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/enhanced_analyzer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/example_enhanced_usage.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/models/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/models/schemas.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/utils/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/utils/batch_processor.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/utils/cost_tracker.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/utils/metrics.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/qualitative/utils/text_processing.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/analytics_writer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/base.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/branch_health_writer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/classification_writer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/cli_integration.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/csv_writer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/data_models.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/database_report_generator.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/example_usage.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/factory.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/formatters.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/html_generator.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/interfaces.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/json_exporter.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/narrative_writer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/story_point_correlation.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/reports/weekly_trends_writer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/security/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/security/config.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/security/extractors/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/security/extractors/dependency_checker.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/security/extractors/secret_detector.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/security/extractors/vulnerability_scanner.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/security/llm_analyzer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/security/security_analyzer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/training/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/training/model_loader.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/training/pipeline.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/ui/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/ui/progress_display.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/verify_activity.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics.egg-info/SOURCES.txt +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics.egg-info/dependency_links.txt +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics.egg-info/entry_points.txt +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics.egg-info/requires.txt +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics.egg-info/top_level.txt +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/conftest.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/core/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/core/test_analyzer.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/core/test_cache.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/core/test_data_fetcher.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/core/test_identity.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/core/test_progress.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/extractors/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/integrations/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/metrics/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/models/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/qualitative/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/qualitative/test_basic_integration.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/reports/__init__.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_atomic_caching.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_classification_system.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_cli.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_config.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_config_extends.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_config_profiles.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_config_story_points.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_jira_connection.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_llm_commit_classification.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_march_2025_comparison.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_metrics.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_ml_accuracy.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_ml_components.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_ml_comprehensive.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_ml_integration.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_pm_env_resolution.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_report_abstraction.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_reports.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_story_points_analysis.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_training_pipeline.py +0 -0
- {gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/tests/test_two_step_process.py +0 -0
|
@@ -628,6 +628,27 @@ def analyze(
|
|
|
628
628
|
|
|
629
629
|
cfg = ConfigLoader.load(config)
|
|
630
630
|
|
|
631
|
+
# Helper function to check if qualitative analysis is enabled
|
|
632
|
+
# Supports both top-level cfg.qualitative and nested cfg.analysis.qualitative
|
|
633
|
+
def is_qualitative_enabled() -> bool:
|
|
634
|
+
"""Check if qualitative analysis is enabled in either location."""
|
|
635
|
+
if cfg.qualitative and cfg.qualitative.enabled:
|
|
636
|
+
return True
|
|
637
|
+
return (
|
|
638
|
+
hasattr(cfg.analysis, "qualitative")
|
|
639
|
+
and cfg.analysis.qualitative
|
|
640
|
+
and cfg.analysis.qualitative.enabled
|
|
641
|
+
)
|
|
642
|
+
|
|
643
|
+
# Helper function to get qualitative config from either location
|
|
644
|
+
def get_qualitative_config():
|
|
645
|
+
"""Get qualitative config from either top-level or nested location."""
|
|
646
|
+
if cfg.qualitative:
|
|
647
|
+
return cfg.qualitative
|
|
648
|
+
if hasattr(cfg.analysis, "qualitative") and cfg.analysis.qualitative:
|
|
649
|
+
return cfg.analysis.qualitative
|
|
650
|
+
return None
|
|
651
|
+
|
|
631
652
|
# Apply CLI overrides for PM integration
|
|
632
653
|
if disable_pm:
|
|
633
654
|
# Disable PM integration if explicitly requested
|
|
@@ -2974,9 +2995,8 @@ def analyze(
|
|
|
2974
2995
|
# Perform qualitative analysis if enabled
|
|
2975
2996
|
qualitative_results = []
|
|
2976
2997
|
qual_cost_stats = None
|
|
2977
|
-
|
|
2978
|
-
|
|
2979
|
-
) and cfg.qualitative:
|
|
2998
|
+
qual_config = get_qualitative_config()
|
|
2999
|
+
if (enable_qualitative or qualitative_only or is_qualitative_enabled()) and qual_config:
|
|
2980
3000
|
if display:
|
|
2981
3001
|
display.print_status("Performing qualitative analysis...", "info")
|
|
2982
3002
|
else:
|
|
@@ -2988,7 +3008,7 @@ def analyze(
|
|
|
2988
3008
|
|
|
2989
3009
|
# Initialize qualitative analysis components
|
|
2990
3010
|
qual_db = Database(cfg.cache.directory / "qualitative.db")
|
|
2991
|
-
qual_processor = QualitativeProcessor(
|
|
3011
|
+
qual_processor = QualitativeProcessor(qual_config, qual_db)
|
|
2992
3012
|
|
|
2993
3013
|
# Validate setup
|
|
2994
3014
|
is_valid, issues = qual_processor.validate_setup()
|
|
@@ -3143,8 +3163,8 @@ def analyze(
|
|
|
3143
3163
|
display.print_status("Continuing with standard analysis...", "info")
|
|
3144
3164
|
else:
|
|
3145
3165
|
click.echo(" ⏭️ Continuing with standard analysis...")
|
|
3146
|
-
elif enable_qualitative and not
|
|
3147
|
-
warning_msg = "Qualitative analysis requested but not configured in config file\n\nAdd a 'qualitative:' section to your configuration"
|
|
3166
|
+
elif enable_qualitative and not get_qualitative_config():
|
|
3167
|
+
warning_msg = "Qualitative analysis requested but not configured in config file\n\nAdd a 'qualitative:' section (top-level or under 'analysis:') to your configuration"
|
|
3148
3168
|
if display:
|
|
3149
3169
|
display.show_warning(warning_msg)
|
|
3150
3170
|
else:
|
|
@@ -4085,12 +4105,12 @@ def analyze(
|
|
|
4085
4105
|
)
|
|
4086
4106
|
else:
|
|
4087
4107
|
# Show note about token tracking when qualitative analysis is not configured
|
|
4088
|
-
if not (enable_qualitative or (
|
|
4108
|
+
if not (enable_qualitative or is_qualitative_enabled()):
|
|
4089
4109
|
click.echo(
|
|
4090
4110
|
"\n💡 Note: Token/cost tracking is only available with qualitative analysis enabled."
|
|
4091
4111
|
)
|
|
4092
4112
|
click.echo(
|
|
4093
|
-
" Add 'qualitative:' section to your config to enable detailed LLM cost tracking."
|
|
4113
|
+
" Add 'qualitative:' section (top-level or under 'analysis:') to your config to enable detailed LLM cost tracking."
|
|
4094
4114
|
)
|
|
4095
4115
|
|
|
4096
4116
|
# Display cache statistics in simple format
|
|
@@ -7,6 +7,8 @@ and comprehensive configuration generation.
|
|
|
7
7
|
import getpass
|
|
8
8
|
import logging
|
|
9
9
|
import os
|
|
10
|
+
import re
|
|
11
|
+
import shutil
|
|
10
12
|
import stat
|
|
11
13
|
import subprocess
|
|
12
14
|
import sys
|
|
@@ -18,6 +20,8 @@ from typing import Optional
|
|
|
18
20
|
import click
|
|
19
21
|
import requests
|
|
20
22
|
import yaml
|
|
23
|
+
from git import GitCommandError, Repo
|
|
24
|
+
from git.exc import InvalidGitRepositoryError
|
|
21
25
|
from github import Github
|
|
22
26
|
from github.GithubException import GithubException
|
|
23
27
|
|
|
@@ -490,6 +494,203 @@ class InstallWizard:
|
|
|
490
494
|
logger.debug(f"Path validation error: {type(e).__name__}")
|
|
491
495
|
return None
|
|
492
496
|
|
|
497
|
+
def _detect_git_url(self, input_str: str) -> Optional[str]:
|
|
498
|
+
"""Detect if input is a Git URL and normalize it.
|
|
499
|
+
|
|
500
|
+
Args:
|
|
501
|
+
input_str: User input string
|
|
502
|
+
|
|
503
|
+
Returns:
|
|
504
|
+
Normalized Git URL if detected, None if it's a local path
|
|
505
|
+
"""
|
|
506
|
+
import re
|
|
507
|
+
|
|
508
|
+
# HTTPS URL patterns
|
|
509
|
+
https_pattern = r"^https?://[^/]+/[^/]+/[^/]+(?:\.git)?$"
|
|
510
|
+
# SSH URL pattern
|
|
511
|
+
ssh_pattern = r"^git@[^:]+:[^/]+/[^/]+(?:\.git)?$"
|
|
512
|
+
|
|
513
|
+
input_str = input_str.strip()
|
|
514
|
+
|
|
515
|
+
if re.match(https_pattern, input_str, re.IGNORECASE) or re.match(ssh_pattern, input_str):
|
|
516
|
+
# Ensure .git extension for consistency
|
|
517
|
+
if not input_str.endswith(".git"):
|
|
518
|
+
input_str = input_str + ".git"
|
|
519
|
+
return input_str
|
|
520
|
+
|
|
521
|
+
return None
|
|
522
|
+
|
|
523
|
+
def _clone_git_repository(self, git_url: str) -> Optional[tuple[Path, str]]:
|
|
524
|
+
"""Clone a Git repository to the local repos/ directory.
|
|
525
|
+
|
|
526
|
+
Args:
|
|
527
|
+
git_url: Git URL to clone
|
|
528
|
+
|
|
529
|
+
Returns:
|
|
530
|
+
Tuple of (local_path, original_url) if successful, None if failed
|
|
531
|
+
"""
|
|
532
|
+
try:
|
|
533
|
+
# Extract repository name from URL
|
|
534
|
+
# Handle both HTTPS and SSH formats
|
|
535
|
+
match = re.search(r"/([^/]+?)(?:\.git)?$", git_url)
|
|
536
|
+
if not match:
|
|
537
|
+
click.echo("❌ Could not extract repository name from URL")
|
|
538
|
+
return None
|
|
539
|
+
|
|
540
|
+
repo_name = match.group(1)
|
|
541
|
+
click.echo(f"📦 Repository: {repo_name}")
|
|
542
|
+
|
|
543
|
+
# Create repos directory in current working directory
|
|
544
|
+
repos_dir = Path.cwd() / "repos"
|
|
545
|
+
repos_dir.mkdir(parents=True, exist_ok=True)
|
|
546
|
+
click.echo(f"📁 Clone directory: {repos_dir}")
|
|
547
|
+
|
|
548
|
+
# Target path for cloned repository
|
|
549
|
+
target_path = repos_dir / repo_name
|
|
550
|
+
|
|
551
|
+
# Check if repository already exists
|
|
552
|
+
if target_path.exists():
|
|
553
|
+
click.echo(f"⚠️ Directory already exists: {target_path}")
|
|
554
|
+
|
|
555
|
+
# Check if it's a valid git repository
|
|
556
|
+
try:
|
|
557
|
+
existing_repo = Repo(target_path)
|
|
558
|
+
if existing_repo.working_dir:
|
|
559
|
+
click.echo("✅ Found existing git repository")
|
|
560
|
+
|
|
561
|
+
# Check if remote URL matches
|
|
562
|
+
try:
|
|
563
|
+
origin_url = existing_repo.remotes.origin.url
|
|
564
|
+
if origin_url == git_url or self._normalize_git_url(
|
|
565
|
+
origin_url
|
|
566
|
+
) == self._normalize_git_url(git_url):
|
|
567
|
+
click.echo(f"✅ Remote URL matches: {origin_url}")
|
|
568
|
+
|
|
569
|
+
# Offer to update
|
|
570
|
+
if click.confirm(
|
|
571
|
+
"Update existing repository (git pull)?", default=True
|
|
572
|
+
):
|
|
573
|
+
click.echo("🔄 Updating repository...")
|
|
574
|
+
origin = existing_repo.remotes.origin
|
|
575
|
+
origin.pull()
|
|
576
|
+
click.echo("✅ Repository updated")
|
|
577
|
+
|
|
578
|
+
return (target_path, git_url)
|
|
579
|
+
else:
|
|
580
|
+
click.echo("⚠️ Remote URL mismatch:")
|
|
581
|
+
click.echo(f" Existing: {origin_url}")
|
|
582
|
+
click.echo(f" Requested: {git_url}")
|
|
583
|
+
if not click.confirm(
|
|
584
|
+
"Use existing repository anyway?", default=False
|
|
585
|
+
):
|
|
586
|
+
return None
|
|
587
|
+
return (target_path, git_url)
|
|
588
|
+
except Exception as e:
|
|
589
|
+
click.echo(f"⚠️ Could not check remote URL: {type(e).__name__}")
|
|
590
|
+
if click.confirm("Use existing repository anyway?", default=False):
|
|
591
|
+
return (target_path, git_url)
|
|
592
|
+
return None
|
|
593
|
+
except InvalidGitRepositoryError:
|
|
594
|
+
click.echo("❌ Directory exists but is not a git repository")
|
|
595
|
+
if not click.confirm("Remove and re-clone?", default=False):
|
|
596
|
+
return None
|
|
597
|
+
|
|
598
|
+
# Remove existing directory
|
|
599
|
+
shutil.rmtree(target_path)
|
|
600
|
+
click.echo("🗑️ Removed existing directory")
|
|
601
|
+
|
|
602
|
+
# Clone the repository
|
|
603
|
+
click.echo(f"🔄 Cloning {git_url}...")
|
|
604
|
+
click.echo(" This may take a moment depending on repository size...")
|
|
605
|
+
|
|
606
|
+
# Clone with progress
|
|
607
|
+
Repo.clone_from(git_url, target_path, progress=self._get_git_progress())
|
|
608
|
+
|
|
609
|
+
# Verify clone succeeded
|
|
610
|
+
if not (target_path / ".git").exists():
|
|
611
|
+
click.echo("❌ Clone appeared to succeed but .git directory not found")
|
|
612
|
+
return None
|
|
613
|
+
|
|
614
|
+
click.echo(f"✅ Successfully cloned to: {target_path}")
|
|
615
|
+
return (target_path, git_url)
|
|
616
|
+
|
|
617
|
+
except GitCommandError as e:
|
|
618
|
+
click.echo("❌ Git clone failed")
|
|
619
|
+
|
|
620
|
+
# Parse error message for common issues
|
|
621
|
+
error_str = str(e).lower()
|
|
622
|
+
if "authentication failed" in error_str or "permission denied" in error_str:
|
|
623
|
+
click.echo("🔐 Authentication required")
|
|
624
|
+
click.echo(" For HTTPS: Configure Git credentials or use a personal access token")
|
|
625
|
+
click.echo(" For SSH: Ensure your SSH key is added to your Git provider")
|
|
626
|
+
elif "not found" in error_str or "does not exist" in error_str:
|
|
627
|
+
click.echo("🔍 Repository not found")
|
|
628
|
+
click.echo(" Check the URL and ensure you have access")
|
|
629
|
+
elif "network" in error_str or "timeout" in error_str:
|
|
630
|
+
click.echo("🌐 Network error")
|
|
631
|
+
click.echo(" Check your internet connection and try again")
|
|
632
|
+
else:
|
|
633
|
+
logger.debug(f"Git clone error type: {type(e).__name__}")
|
|
634
|
+
|
|
635
|
+
return None
|
|
636
|
+
|
|
637
|
+
except OSError as e:
|
|
638
|
+
error_type = type(e).__name__
|
|
639
|
+
click.echo(f"❌ File system error: {error_type}")
|
|
640
|
+
if "space" in str(e).lower():
|
|
641
|
+
click.echo("💾 Insufficient disk space")
|
|
642
|
+
logger.debug(f"Clone file system error: {error_type}")
|
|
643
|
+
return None
|
|
644
|
+
|
|
645
|
+
except Exception as e:
|
|
646
|
+
error_type = type(e).__name__
|
|
647
|
+
click.echo(f"❌ Unexpected error during clone: {error_type}")
|
|
648
|
+
logger.error(f"Clone error type: {error_type}")
|
|
649
|
+
return None
|
|
650
|
+
|
|
651
|
+
def _normalize_git_url(self, url: str) -> str:
|
|
652
|
+
"""Normalize Git URL for comparison.
|
|
653
|
+
|
|
654
|
+
Args:
|
|
655
|
+
url: Git URL to normalize
|
|
656
|
+
|
|
657
|
+
Returns:
|
|
658
|
+
Normalized URL (lowercase, with .git extension)
|
|
659
|
+
"""
|
|
660
|
+
url = url.lower().strip()
|
|
661
|
+
if not url.endswith(".git"):
|
|
662
|
+
url = url + ".git"
|
|
663
|
+
return url
|
|
664
|
+
|
|
665
|
+
def _get_git_progress(self):
|
|
666
|
+
"""Get a Git progress handler for clone operations.
|
|
667
|
+
|
|
668
|
+
Returns:
|
|
669
|
+
Progress handler for GitPython or None
|
|
670
|
+
"""
|
|
671
|
+
try:
|
|
672
|
+
from git import RemoteProgress
|
|
673
|
+
|
|
674
|
+
class CloneProgress(RemoteProgress):
|
|
675
|
+
"""Progress handler for git clone operations."""
|
|
676
|
+
|
|
677
|
+
def __init__(self):
|
|
678
|
+
super().__init__()
|
|
679
|
+
self.last_percent = 0
|
|
680
|
+
|
|
681
|
+
def update(self, op_code, cur_count, max_count=None, message=""):
|
|
682
|
+
if max_count:
|
|
683
|
+
percent = int((cur_count / max_count) * 100)
|
|
684
|
+
# Only show updates every 10%
|
|
685
|
+
if percent >= self.last_percent + 10:
|
|
686
|
+
click.echo(f" Progress: {percent}%")
|
|
687
|
+
self.last_percent = percent
|
|
688
|
+
|
|
689
|
+
return CloneProgress()
|
|
690
|
+
except Exception:
|
|
691
|
+
# If progress handler fails, return None (clone will work without it)
|
|
692
|
+
return None
|
|
693
|
+
|
|
493
694
|
def _setup_manual_repos(self) -> bool:
|
|
494
695
|
"""Setup manual repository configuration.
|
|
495
696
|
|
|
@@ -497,44 +698,66 @@ class InstallWizard:
|
|
|
497
698
|
True if setup successful, False otherwise
|
|
498
699
|
"""
|
|
499
700
|
click.echo("\n📦 Manual Repository Mode")
|
|
500
|
-
click.echo("You can specify one or more local repository paths.")
|
|
701
|
+
click.echo("You can specify one or more local repository paths or Git URLs.")
|
|
702
|
+
click.echo("Supported formats:")
|
|
703
|
+
click.echo(" • Local path: /path/to/repo or ~/repos/myproject")
|
|
704
|
+
click.echo(" • HTTPS URL: https://github.com/owner/repo.git")
|
|
705
|
+
click.echo(" • SSH URL: git@github.com:owner/repo.git")
|
|
501
706
|
click.echo()
|
|
502
707
|
|
|
503
708
|
repositories = []
|
|
504
709
|
while True:
|
|
505
|
-
|
|
506
|
-
"Enter repository path (or press Enter to finish)",
|
|
710
|
+
repo_input = click.prompt(
|
|
711
|
+
"Enter repository path or Git URL (or press Enter to finish)",
|
|
507
712
|
type=str,
|
|
508
713
|
default="",
|
|
509
714
|
show_default=False,
|
|
510
715
|
).strip()
|
|
511
716
|
|
|
512
|
-
if not
|
|
717
|
+
if not repo_input:
|
|
513
718
|
if not repositories:
|
|
514
719
|
click.echo("❌ At least one repository is required")
|
|
515
720
|
continue
|
|
516
721
|
break
|
|
517
722
|
|
|
518
|
-
#
|
|
519
|
-
|
|
520
|
-
if
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
723
|
+
# Check if input is a Git URL
|
|
724
|
+
git_url = self._detect_git_url(repo_input)
|
|
725
|
+
if git_url:
|
|
726
|
+
# Handle Git URL cloning
|
|
727
|
+
result = self._clone_git_repository(git_url)
|
|
728
|
+
if result is None:
|
|
729
|
+
# Clone failed, ask user if they want to retry or skip
|
|
730
|
+
if not click.confirm("Try a different repository?", default=True):
|
|
731
|
+
if repositories:
|
|
732
|
+
break # User has other repos, can finish
|
|
733
|
+
continue # User has no repos yet, must add at least one
|
|
526
734
|
continue
|
|
527
735
|
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
736
|
+
# Clone successful
|
|
737
|
+
local_path, original_url = result
|
|
738
|
+
repositories.append({"path": str(local_path), "git_url": original_url})
|
|
739
|
+
click.echo(f"Added repository #{len(repositories)}")
|
|
531
740
|
else:
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
741
|
+
# Handle local path
|
|
742
|
+
path_obj = self._validate_directory_path(repo_input, "Repository path")
|
|
743
|
+
if path_obj is None:
|
|
744
|
+
continue # Re-prompt
|
|
745
|
+
|
|
746
|
+
if not path_obj.exists():
|
|
747
|
+
click.echo(f"⚠️ Path does not exist: {path_obj}")
|
|
748
|
+
if not click.confirm("Add anyway?", default=False):
|
|
749
|
+
continue
|
|
750
|
+
|
|
751
|
+
# Check if it's a git repository
|
|
752
|
+
if (path_obj / ".git").exists():
|
|
753
|
+
click.echo(f"✅ Valid git repository: {path_obj}")
|
|
754
|
+
else:
|
|
755
|
+
click.echo(f"⚠️ Not a git repository: {path_obj}")
|
|
756
|
+
if not click.confirm("Add anyway?", default=False):
|
|
757
|
+
continue
|
|
535
758
|
|
|
536
|
-
|
|
537
|
-
|
|
759
|
+
repositories.append({"path": str(path_obj)})
|
|
760
|
+
click.echo(f"Added repository #{len(repositories)}")
|
|
538
761
|
|
|
539
762
|
if not click.confirm("Add another repository?", default=False):
|
|
540
763
|
break
|
|
@@ -258,7 +258,14 @@ class ConfigLoader:
|
|
|
258
258
|
jira_integration_config = cls._process_jira_integration_config(
|
|
259
259
|
data.get("jira_integration", {})
|
|
260
260
|
)
|
|
261
|
-
|
|
261
|
+
|
|
262
|
+
# Check for qualitative config in both top-level and nested under analysis
|
|
263
|
+
# Prioritize top-level for backward compatibility, but support nested location
|
|
264
|
+
qualitative_data = data.get("qualitative", {})
|
|
265
|
+
if not qualitative_data and "analysis" in data:
|
|
266
|
+
qualitative_data = data["analysis"].get("qualitative", {})
|
|
267
|
+
qualitative_config = cls._process_qualitative_config(qualitative_data)
|
|
268
|
+
|
|
262
269
|
pm_config = cls._process_pm_config(data.get("pm", {}))
|
|
263
270
|
pm_integration_config = cls._process_pm_integration_config(data.get("pm_integration", {}))
|
|
264
271
|
|
|
@@ -536,6 +543,12 @@ class ConfigLoader:
|
|
|
536
543
|
BranchAnalysisConfig(**branch_data) if branch_data else BranchAnalysisConfig()
|
|
537
544
|
)
|
|
538
545
|
|
|
546
|
+
# Process qualitative configuration (support nested under analysis)
|
|
547
|
+
qualitative_data = analysis_data.get("qualitative", {})
|
|
548
|
+
qualitative_config = (
|
|
549
|
+
cls._process_qualitative_config(qualitative_data) if qualitative_data else None
|
|
550
|
+
)
|
|
551
|
+
|
|
539
552
|
# Process aliases file and manual identity mappings
|
|
540
553
|
manual_mappings = list(analysis_data.get("identity", {}).get("manual_mappings", []))
|
|
541
554
|
aliases_file_path = None
|
|
@@ -595,6 +608,7 @@ class ConfigLoader:
|
|
|
595
608
|
commit_classification=commit_classification_config,
|
|
596
609
|
llm_classification=llm_classification_config,
|
|
597
610
|
security=analysis_data.get("security", {}),
|
|
611
|
+
qualitative=qualitative_config,
|
|
598
612
|
)
|
|
599
613
|
|
|
600
614
|
@classmethod
|
|
@@ -316,6 +316,7 @@ class AnalysisConfig:
|
|
|
316
316
|
)
|
|
317
317
|
llm_classification: LLMClassificationConfig = field(default_factory=LLMClassificationConfig)
|
|
318
318
|
security: Optional[dict[str, Any]] = field(default_factory=dict) # Security configuration
|
|
319
|
+
qualitative: Optional["QualitativeConfig"] = None # Nested qualitative config support
|
|
319
320
|
|
|
320
321
|
|
|
321
322
|
@dataclass
|
|
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
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/_archive/temp-files/SYNTAX_ERROR_FIX.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/architecture/llm-classifier-refactoring.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/design/circuit-breaker-implementation.md
RENAMED
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/design/commit-classification-design.md
RENAMED
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/design/git_pm_correlation_design.md
RENAMED
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/design/platform-agnostic-pm-framework.md
RENAMED
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/design/qualitative_data_extraction.md
RENAMED
|
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
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/guides/identity-resolution-enhanced.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/docs/quick-reference/launcher-and-identity.md
RENAMED
|
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
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/classification/model.py
RENAMED
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/cli_wizards/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/__init__.py
RENAMED
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/aliases.py
RENAMED
|
File without changes
|
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/profiles.py
RENAMED
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/repository.py
RENAMED
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/config/validator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/branch_mapper.py
RENAMED
|
File without changes
|
|
File without changes
|
{gitflow_analytics-3.9.3 → gitflow_analytics-3.10.6}/src/gitflow_analytics/core/data_fetcher.py
RENAMED
|
File without changes
|