All notable changes to GitFlow Analytics will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- gitflow-analytics is archived as of v4.0.0. This is the final release; no further updates, bug fixes, or security patches will be published. Migrate to
tga(cargo install tga).
- All documentation surfaces (README, CLI reference, CHANGELOG) now carry archive banners pointing to
tga.
MIGRATION.mdat repo root — comprehensive guide for moving totga, including feature comparison, command mapping, and license notes.
- Eliminate redundant API fetches across incremental data pulls — every
unnecessary call costs money and consumes rate-limit budget:
- GitHub open-PR refresh now has a per-PR TTL guard. Previously
_refresh_stale_open_prs()re-fetched up to 50 open PRs on every run with no freshness check. PRs whosecached_atis newer thanopen_pr_refresh_ttl_hours(default 1.0) are now skipped. Configurable viagithub.open_pr_refresh_ttl_hoursin YAML; set to0to disable. - GitHub PR pagination now anchors to a cache watermark. Re-introduced
since = max(MAX(cached_at), requested_since)so back-to-back runs no longer re-paginate from the user-suppliedstart_date.cache_pr()upsert is idempotent so any overlap is safe.--backfill-since/--backfill-prs-sincebypass this optimization. - Confluence space scan now respects an incremental watermark + TTL.
Mirrors the JIRA-activity
_get_effective_sincepattern: scan is skipped entirely when the last successful scan completed withinfull_scan_ttl_hours(default 1.0); otherwise the lower bound advances tomax(last_processed, requested_since)to avoid re-scanning unchanged pages.
- GitHub open-PR refresh now has a per-PR TTL guard. Previously
- Replace deprecated
datetime.utcnow()inJIRAIntegration._is_ticket_stalewith timezone-awaredatetime.now(timezone.utc); naive cached_at values are normalized to UTC consistently.
- Replacement tool
tgais published on crates.io at v1.3.0 and reads existing gitflow-analytics YAML configs unchanged. - Published benchmark: tga is 45× faster than gitflow-analytics on a 482-commit repo (1.65s vs 74.38s); ~113,000 commits/sec rule-only throughput on a 72,608-commit corpus.
- License change to be aware of:
tgais Elastic-2.0 (non-commercial use only); gitflow-analytics remains MIT.
--week YYYY-Wwwflag ongfa collect,gfa classify, andgfa report— target a specific ISO week (repeatable for multiple discrete weeks) (#70)--from YYYY-Www --to YYYY-Wwwflag pair on all three commands — target an inclusive ISO week range (#70)src/gitflow_analytics/utils/iso_week.py—parse_iso_week()andiso_week_range()helpers for ISO 8601 week string parsing_resolve_date_range()shared helper in CLI centralises mutual-exclusivity validation for all three commands
--week/--from/--toare mutually exclusive with an explicit--weeks Nvalue; clear UsageError is raised when combined- Progress output shows ISO week range when targeted:
Classifying 2026-W01 → 2026-W07 (targeted window) - Taxonomy-only remaps (
work_typelabel updates viataxonomy_mappingconfig) still apply instantly regardless of targeted window
platformnative change_type: New first-class classifier category distinct frommaintenance— captures deliberate infrastructure/architectural investment, internal tooling, and DevOps improvements. LLM prompt updated to distinguishplatform(new capability) frommaintenance(routine upkeep). Fallback patterns and NLP classifier updated. (#69)- Config-driven taxonomy mapping:
taxonomy_mapping.change_typeconfig block maps gfa's nativechange_typevalues to custom org-specific labels (e.g.maintenance→ "KTLO",platform→ "Platform work"). (#69) work_typecolumn onqualitative_commits(v18 migration): populated fromtaxonomy_mappingwhen configured; falls back tochange_typewhen no mapping is present. (#69)- Fast taxonomy remap:
gfa classify --reclassifyapplies taxonomy mapping to all historical commits in seconds — no LLM calls required for pure label remaps. (#69)
pipeline_reportnow exposeswork_type(withchange_typefallback) on all commit dicts for downstream report renderingplatformadded to fallback patterns, NLP classifier, and ISSUETYPE_CHANGE_TYPE_MAP (Infrastructure → platform)
- "Platform work" metric collapse resolved:
platformchange_type + taxonomy mapping provides a clean, unambiguous path from classifier output to org-specific analytics labels - Pyright: string annotations for optional spaCy
Doctype inchange_type.py
- Mark unused method parameters as intentionally discarded to silence Pyright warnings
- Silence SQLAlchemy
Columntype errors inbatch_classifier_implvia targeted# type: ignorecomments - Remove unused variable warnings in batch classifier and issuetype tests
- Tier-1.5 issuetype classifier: Issue-linked commits are now classified via their JIRA/GH ticket
issuetypefield (confidence 0.90) before falling through to the LLM — eliminates LLM overhead for commits where the ticket type already encodes the answer (#68) IssueCache.issue_typecolumn (v17 migration) —issuetypeextracted from JIRA API response during sync and stored as a queryable top-level fieldbusiness_domainnow populated from ticketcomponents/labelsfor issue-linked commits (was always "unknown")- Issuetype → change_type mapping: Bug→bugfix, Story/Feature/Epic→feature, Task+platform-label→maintenance, Task+refactor-label→refactor, Documentation→documentation, Test→test; ambiguous Task/Sub-task falls through to LLM
- "Platform work" metric no longer collapses to 0% — issue-linked commits with Bug/Story/Task issuetype bypass the gitflow_cache rule-based path (which cannot produce "Platform work") and use the authoritative ticket signal instead
- Classification overrides:
classification_overridestable +gfa override set/list/removeCLI commands (#63) - AI detection cache: AI-detection results stored to cache DB +
gfa backfill-ai-detectionCLI command (#47) - Revert tracking:
is_revertfield incached_commits+reversion_commitscount in metrics (#64) - Coverage warnings: Classification coverage warnings +
--validate-coverage/--coverage-thresholdflags (#65) - JIRA tier-3 classifier: JIRA project-key →
work_typemapping viajira_project_mappingsconfig (#62) - AI footer detection: Made-with-AI trailer detection for Cursor, Claude, Copilot commit footers (#61)
- PR metrics:
pr_merge_rateandavg_cycle_time_hrsfields inweekly_pr_metrics(#66) - Ticket IDs from PR titles: Extract ticket IDs from PR title text + regex false-positive suppression (#54)
- Performance: TTL guards + watermark anchors to eliminate redundant API fetches
gfa backfill-ticket-idsextended to scan PR titles in addition to commit messages
- Pyright type errors across test files (spacy import guard, revert detection imports)
- Resolve Pyright type errors in reports factory and example_usage introduced
by 3.15.1 formatting refactor:
factory.py: widenregister_generatorgenerator_classparameter totype[Any](generators conform via Protocol, not strict inheritance); useSequencefor covariantreport_typesparameter; guard empty-stringoutput_pathagainstPath | Nonetypingexample_usage.py: matchgenerate()override signatures to basePath | None; useOptional[Path]in custom generator constructorstest_github_username_sync.py: silence unusedparams/timeoutparameters in mock callbacks viadel(preserves keyword arg matching expected byrequests.Session.getmocks)
- Apply Black/Ruff formatting across the
reportsmodule and JIRA/Confluence integrations: consistent double-quote style, one-argument-per-line call sites, and collapsed implicit string concatenations into single f-strings - Modernise
reportsmodule type annotations fromtyping.List/Dict/Typeto built-inlist/dict/type(Python 3.10+ style)
factory.py: replace baretry/except/passwithcontextlib.suppressexample_usage.py: add missing local import ofBaseReportGenerator/ReportOutputinexample_template_based_generation()base.py: rename loop variablefield→field_nameto avoid shadowingdataclasses.field; flatten nestedifto single compound conditionformatters.py: add missingimport oscsv_reports_dora.py: add missingimport csvtest_github_username_sync: update mock_get()signatures from_params/_timeouttoparams/timeoutto match production keyword argstest_jira_activity_integration: migrate_fetch_issuesmocks from_get_with_retriesto_post_with_retries(POST/rest/api/3/search/jql); update pagination shape toisLast/nextPageTokentest_pr_reporting: replace.replace(day=N+2)arithmetic withtimedeltaaddition to preventValueErrorwhen running near month boundaries
UnifiedIssue.story_pointswidened frominttofloat; JIRA adapter now preserves fractional values (e.g., 3.5 instead of 3). SQLite schema updated from INTEGER to REAL. Teams using modified Fibonacci scales will now see correct values in reports. (#56)
- #55:
--backfill-sincenow applies to both commit fetching and PR fetching- Previously,
--backfill-sinceonly backfilled commits;pull_request_cacheremained empty for historical dates - Added
--backfill-prs-since YYYY-MM-DDflag for PR-only window override (takes priority over--backfill-sincefor the PR fetch) - Adds end-to-end regression test ensuring
--backfill-sincethreads through toenrich_repository_data
- Previously,
- feat: add
commit_countandticket_idscolumns topull_request_cache(#53)commit_count INTEGER—len(commit_hashes), populated automatically at fetch time with no additional API callsticket_ids JSON— deduplicated list of JIRA-style ticket IDs (e.g.["DUE-1234", "CORE-567"]) extracted from all commit messages in the PR viapr.get_commits()during enrichment
- feat: add
gfa backfill-ticket-idscommand to populateticket_idsandcommit_counton existing cached PRs usingcached_commits.message— no GitHub API calls, idempotent
- feat: add
--backfill-since YYYY-MM-DDtogfa fetchandgfa analyzefor historical PR hydration (#52)- Fetches all merged PRs from the GitHub API back to the specified date
- Bypasses the incremental fetch gate that previously blocked historical fetches
- Auto-triggers
weekly_pr_metricsrollup for the same date range - Idempotent — safe to re-run with the same date
- Does not change default (incremental) behavior
- #43: Pass cache/since/until to CSVReportGenerator in gfa analyze path
- #44: Populate github_username from noreply emails and config manual_mappings
- #42: Thread cache/since/until into CSVReportGenerator (gfa report path)
- #41: Resolve canonical identity for ticketing_score lookup in developer CSV
- #40: Add ticketing_score column to developer activity CSV output
- #39: Guard against NULL total_commits in identity sort and merge
- #37: ActivityScorer ticketing_weight blends ticketing_score into raw_activity_score
- #38: JIRAActivityIntegration fetches JIRA issues/comments via JQL
- Boilerplate filter: flag/exclude bulk auto-generated commits from velocity metrics
- #32: Wire ticketing reports into gfa analyze (github_issues_summary.json, confluence_activity_summary.json, ticketing_activity_summary.json now produced without separate gfa report run)
- #33: Fix Confluence 401 — warn on unset env vars, pre-flight credential check on init
- #34: UNIQUE constraint violations now log at DEBUG not ERROR
- #31: GitHub Issues and Confluence ticketing activity tracking
- New DB tables: ticketing_activity_cache, confluence_page_cache (v10 migration)
- New reports: github_issues_summary.json, confluence_activity_summary.json, ticketing_activity_summary.json
- PR status tracking:
pr_state,closed_at, andis_mergedcolumns inPullRequestCache(v4 schema migration) - Incremental stale-open-PR refresh: up to 50 stale open PRs updated per
gfa collectrun - Rejection metrics in narrative reports and CSV output (merge rate, rejection rate, per-author breakdown)
gfa aliasesnow supports AWS Bedrock as an LLM provider; auto-detected from config- Configurable
strip_suffixeslist underanalysis.identity.strip_suffixesfor alias generation gfa reportloads cached PR data from the database via newget_cached_prs_for_report()method- DORA metrics, velocity, and narrative reports now incorporate real PR lifecycle data
gfa collectenriches already-cached repos with PR data whengithub_repois set — no re-collect needed
fetch_pr_reviewsconfig option now correctly wired through to the GitHub fetch layer (was a no-op)
- Alias generation provider priority: Bedrock > OpenRouter > heuristic-only
github.organizationfield is now the recommended way to scope PR collection to an org
- Comprehensive documentation organization and standards
- Documentation standards based on Edgar project best practices
- Interactive launcher examples with complete workflows
- Story points configuration guide for JIRA integration
- Refactoring guide moved to developer documentation
- Project organization standards documentation
- All internal documentation links validated and corrected
- Documentation structure reorganized according to new standards
- Broken links in main README and examples documentation
- Test file path issues in error handling tests
- Moved and consolidated documentation files according to new standards
- Archived outdated documentation files with proper date suffixes
- Updated all README files to reflect new organization structure
- Backfilled changelog with all missing versions from 1.2.24 to 3.13.3
- Numbered selection UX for renaming developer aliases
- Interactive CLI menu with alias-rename option
- Interactive menu system with canonical name fixes
- Enhanced developer alias management workflow
- Improved user experience for alias operations
- Interactive menu system for developer alias management
- Alias-rename command functionality
- Canonical name fixes for developer identities
- Interactive CLI menu with alias-rename option
- Enhanced developer alias management
- Interactive menu system for developer management
- Alias-rename command for developer identities
- Canonical name fixes and improvements
- Claude MPM configuration file for enhanced AI integration
- Black formatting in commit_utils.py
- Black formatting in utils init.py
- Default branch handling in test fixtures
- Default branch handling in second merge operation
- Default branch name handling in integration test fixture
- Comprehensive improvements to merge commit exclusion feature
- Merge commit exclusion in GitDataFetcher for two-step architecture
- Removed Python cache files from version control
- Reverted direct spaCy model dependency due to PyPI restrictions
- Automatic spaCy model installation
- PROJECT_ORGANIZATION.md standard documentation
- Updated CLAUDE.md configuration
- Archived temporary documentation files
- Simplified return condition in is_qualitative_enabled
- Support for nested qualitative config under analysis section
- Black formatting in install_wizard.py
- Moved git imports to module level
- Alphabetized git imports
- Moved re and shutil imports to top level
- Linting errors in install_wizard.py
- Git URL cloning support to manual repository mode
- Activity score normalization for reports without PR data
- Black formatting in install_wizard.py
- Removed unused pm_config variable in install wizard
- Multi-platform PM ticketing support to installation wizard
- Ignore qualitative_cache and uv.lock files
- 'gfa' as a shorthand command alias
- Progress callback support to organization repository discovery
- Black code formatting
- Ruff F821 linter errors from lazy imports
- Clone progress, retry logic, and PM platform filtering
- Optimized CLI startup time with lazy imports
- Repository cloning to emergency fetch
- Automatic schema migration for timezone fix
- Automatically trim whitespace from interactive setup inputs
- Removed TUI code
- Uninitialized variable error when all repos use cached data
- Critical timezone mismatch causing zero commits in database queries
- Added Claude MPM cache directories to .gitignore
- Guide users through config creation when file not found
- Applied black formatting to new code
- Linting errors in aliases system implementation
- Developer aliases system with LLM generation
- Installation profiles for enhanced setup
- All remaining ruff linting errors across project
- Ruff linting errors in verify_activity
- Removed failing test files from repository
- Interactive launcher and enhanced identity detection
- Comprehensive refactoring guide and tracking
- Extracted magic numbers to centralized constants module
- Bare exception handlers and added type hints
- Pre-flight git authentication and enhanced error reporting
- Remote branch analysis by preserving full branch references
- UnboundLocalError from redundant import in CLI
- Applied Black formatting and auto-fix Ruff linting issues
- Security analysis module and project cleanup
- F-string syntax error in git_timeout_wrapper.py
- Thread safety in GitDataFetcher with thread-local storage
- Progress tracking functionality
- Unhashable dict error
- Respect ticket_platforms configuration for ticket detection
- Changed default display to simple output to prevent TUI hanging
- TUI slow shutdown by properly managing thread executors
- TUI hanging during parallel repository analysis
- Missing RadioButton import in results screen
- TUI status reporting to distinguish 'no commits' from 'failed'
- TUI showing all repositories as failed when they have commits
- TUI hanging during parallel repository analysis
- TUI widget mounting errors in results_screen
- Limited TUI parallel processing to single worker to avoid GitPython thread safety issues
- TUIProgressAdapter signature mismatch causing all repositories to fail
- 'core_progress' not accessible error in TUI
- Properly set up TUI progress service for parallel repository processing
- Set up progress service for TUI parallel repository processing
- Initialize dark mode attribute in TUI app
- Update JIRA API endpoints to use new /search/jql path
- TUI stuck at 50% due to repository access issues
- Comprehensive testing framework with TUI integration
- TUI progress tracking bugs and syntax errors
- Rich Pretty with Textual Static widget replacement
- TUI configuration loading and Pretty widget issues
- Added common CLI options to TUI command
- TUI as the default interface with CLI fallback
- TUI is now the default interface (major version bump)
- Full-screen terminal interface restoration
- Restored TUI command with full-screen terminal interface (major version bump)
- Enabled Rich terminal UI by default
- Hide PM framework and JIRA adapter debug messages
- Clean up debug output and fix full-screen UI transition
- Restart full-screen UI for Step 2 batch classification
- Enable full-screen terminal UI in batch processing mode
- Repository table comparison bug in full-screen UI
- Live repository status tracking during analysis
- Enhanced repository progress display during analysis
- Made psutil an optional dependency for progress display
- Environment variables resolution in PM integration config
- Filtered stats storage for accurate line count exclusions
- Sophisticated Rich-based progress display for better UX
- Filtered stats storage for accurate line count exclusions
- Applied black formatting to schema.py
- Applied black formatting
- Removed unused imports from data_fetcher
- Branch analysis and added granular progress tracking
- Temporarily disabled mypy in CI to unblock PyPI releases
- Relaxed mypy configuration to allow PyPI release
- Applied Black formatting for consistent code style
- All remaining linting issues for clean CI/CD
- Critical linting errors blocking PyPI release
- All remaining test failures for PyPI publishing
- Updated tests to match new comprehensive help system
- Comprehensive help system with enhanced CLI documentation
- Consolidated all multi-repository analysis fixes for EWTN organization
- Verified accuracy with sniff test on Aug 18-24 data (4 commits confirmed)
- All previous fixes working correctly:
- Repository processing progress indicator
- Authentication prompt elimination
- Qualitative analysis error handling
- Timestamp type handling
- Multi-repository analysis accuracy confirmed
- Proper commit attribution across 95 repositories
- Correct date range filtering
- Accurate ticket coverage calculation (75%)
- Fixed qualitative analysis 'int' object is not subscriptable error
- Corrected timestamp default value in NLP engine from time.time() to datetime.now()
- Added proper datetime import to nlp_engine module
- This resolves type mismatch when timestamp field is missing
- Fixed qualitative analysis commit format handling
- Now handles both dict and object formats for commits
- Fixed 'dict' object has no attribute 'hash' error
- Fixed SQLAlchemy warning about text expressions
- Added proper text() wrapper for SELECT 1 statement
- Fixed password prompts in data_fetcher during fetch/pull operations
- Replaced GitPython's fetch() and pull() with subprocess calls
- Added same environment variables to prevent credential prompts
- Added 30-second timeout for both fetch and pull operations
- This fixes the issue in the two-step fetch/classify process
- Replaced GitPython clone with subprocess for better control
- Uses subprocess.run with explicit timeout (30 seconds)
- Disables credential helper to prevent prompts
- Sets GIT_TERMINAL_PROMPT=0 and GIT_ASKPASS= to force failure
- Shows which repository is being cloned for debugging
- Properly handles timeout with clear error message
- Improved clone operation with timeout and better credential handling
- Added HTTP timeout (30 seconds) to prevent hanging on network issues
- Fixed environment variable passing to GitPython
- Added progress counter (x/95) to description for better visibility
- Enhanced credential failure detection
- Enhanced GitHub authentication handling to prevent interactive password prompts
- Added GIT_TERMINAL_PROMPT=0 to disable git credential prompts
- Added GIT_ASKPASS=/bin/echo to prevent password dialogs
- Better detection of authentication failures (401, 403, permission denied)
- Clear error messages when authentication fails instead of hanging
- CRITICAL: Fixed indentation bug in CLI that prevented multi-repository analysis
- Repository analysis code was incorrectly placed outside the for loop
- This caused only the last repository to be analyzed instead of all repositories
- Progress indicator now correctly updates for each repository (fixes "0/95" issue)
- Added authentication error handling for GitHub operations
- Prevents password prompts when GitHub token is invalid or expired
- Continues with local repository state if authentication fails
- Provides clear error messages for authentication issues
- Fixed repositories not being updated from remote before analysis
- Added automatic git fetch/pull before analyzing repositories
- Impact: Ensures latest commits are included in analysis (fixes EWTN missing commits issue)
- Fixed commits not being stored in CachedCommit table during fetch step
- Fixed narrative report generation when CSV generation is disabled (now default)
- Fixed canonical_id not being set on commits loaded from database
- Fixed timezone comparison issues in batch classification
- Fixed missing
classify_commits_batchmethod in LLMCommitClassifier - Fixed complexity_delta None value handling in narrative reports
- Fixed LLM classification to properly use API keys from .env files
- Added token tracking and cost display for LLM classification
- Added LLM usage statistics display after batch classification
- Shows model, API calls, total tokens, cost, and cache hits
- Improved error handling in commit storage with detailed logging
- Commits are now properly stored in CachedCommit table during data fetch
- Identity resolver now updates canonical_id on commits for proper attribution
- Batch classifier now correctly queries commits with timezone-aware filtering
- Two-step process (fetch then classify) is now the default behavior for better performance and cost efficiency
- Automatic data fetching when using batch classification mode
- New
--use-legacy-classificationflag to use the old single-step process if needed
analyzecommand now uses two-step process by default (fetch raw data, then classify)--use-batch-classificationis now enabled by default (was previously opt-in)- Improved messaging to clearly indicate Step 1 (fetch) and Step 2 (classify) operations
- Better integration between fetch and analyze operations for seamless user experience
- Fixed JIRA integration error: "'IntegrationOrchestrator' object has no attribute 'jira'"
- Corrected attribute access to use
orchestrator.integrations.get('jira')instead oforchestrator.jira - Fixed batch classification mode to automatically perform data fetching when needed
- Two-step process reduces LLM costs by batching classification requests
- Faster subsequent runs when data is already fetched and cached
- More efficient processing of large repositories with many commits
- Database-backed reporting system with SQLite storage for daily metrics
- Weekly trend analysis showing week-over-week changes in classification patterns
- Commit classification breakdown in project activity sections of narrative reports
- Support for flexible configuration field names (api_key/openrouter_api_key, model/primary_model)
- Auto-enable qualitative analysis when configured (no CLI flag needed)
- New
DailyMetricsandWeeklyTrendsdatabase tables - Database report generator that pulls directly from SQLite
- Per-developer and per-project classification metrics
- Cost tracking configuration mapping from cost_tracking.daily_budget_usd
- All commits now properly classified into meaningful categories (feature, bug_fix, refactor, etc.)
- Tracked commits no longer use "tracked_work" as a category - properly classified instead
- Ticket information now enhances classification accuracy
- Ticket coverage displayed separately from classifications as a process metric
- HTML report temporarily disabled pending redesign (code preserved)
- Improved configuration field mapping for better compatibility
- Ticket platform filtering now properly respects configuration (e.g., JIRA-only)
- DateTime import scope issues in CLI module
- Classification data structure in narrative reports
- Identity resolution for developer mappings
- Qualitative analysis auto-enablement from configuration
- Database caching reduces report generation time by up to 80%
- Batch processing for daily metrics storage
- Optimized queries with proper indexing
- Pre-calculated weekly trends for instant retrieval
1.0.7 - 2025-08-01
- Fixed timezone comparison error when sorting deployments in DORA metrics
- Added proper timezone normalization for all timestamps before sorting
- Improved handling of None timestamps in DORA calculations
1.0.6 - 2025-08-01
- Fixed timezone comparison errors in DORA metrics calculation
- Added comprehensive timezone handling for all deployment and PR timestamps
- Enhanced debug logging to trace analysis pipeline stages
1.0.5 - 2025-08-01
- Fixed DEBUG logging not appearing due to logger configuration issues
- Added timestamp normalization to ensure all Git commits use UTC timezone
- Enhanced debug output to identify which report fails
1.0.4 - 2025-08-01
- Structured logging with --log option (none|INFO|DEBUG)
- Enhanced timezone error debugging capabilities
- Safe datetime comparison functions
- Improved debugging output for timezone-related issues
- Better error messages for datetime comparison failures
1.0.3 - 2025-08-01
- Fixed comprehensive timezone comparison issues in database queries and report generation
- Improved timezone-aware datetime handling across all components
- Fixed timezone-related errors that were still affecting v1.0.2
1.0.2 - 2025-08-01
- Fixed SQLite index naming conflicts that could cause database errors
- Fixed PR cache UNIQUE constraint errors with proper upsert logic
- Fixed timezone comparison errors in report generation
- Added loading screen to TUI (before abandoning TUI approach)
- Moved Rich to core dependencies for better CLI output
1.0.1 - 2025-07-31
- Path exclusion support for filtering boilerplate/generated files from line count metrics
- Configurable via
analysis.exclude.pathsin YAML configuration - Default exclusions for common patterns (node_modules, lock files, minified files, etc.)
- Filtered metrics available as
filtered_insertions,filtered_deletions,filtered_files_changed
- Configurable via
- JIRA integration for fetching story points from tickets
- Configurable story point field names via
jira_integration.story_point_fields - Automatic story point extraction from JIRA tickets referenced in commits
- Support for custom field IDs and field names
- Configurable story point field names via
- Organization-based repository discovery from GitHub
- Automatic discovery of all non-archived repositories in an organization
- No manual repository configuration needed for organization-wide analysis
- Ticket platform filtering via
analysis.ticket_platforms- Ability to track only specific platforms (e.g., only JIRA, ignoring GitHub Issues)
- Enhanced
.envfile support- Automatic loading from configuration directory
- Validation of required environment variables
- Clear error messages for missing credentials
- New CLI command:
discover-jira-fieldsto find custom field IDs
- All report generators now use filtered line counts when available
- Cache and output directories now default to config file location (not current directory)
- Improved developer identity resolution with better consolidation
- Timezone comparison errors between GitHub and local timestamps
- License configuration in pyproject.toml for PyPI compatibility
- Manual identity mapping format validation
- Linting errors for better code quality
- Added comprehensive environment variable configuration guide
- Complete configuration examples with
.envand YAML files - Path exclusion documentation with default patterns
- Updated README with clearer setup instructions
1.0.0 - 2025-07-29
- Initial release of GitFlow Analytics
- Core Git repository analysis with batch processing
- Developer identity resolution with fuzzy matching
- Manual identity mapping support
- Story point extraction from commit messages
- Multi-platform ticket tracking (GitHub, JIRA, Linear, ClickUp)
- Comprehensive caching system with SQLite
- CSV report generation:
- Weekly metrics
- Developer statistics
- Activity distribution
- Developer focus analysis
- Qualitative insights
- Markdown narrative reports with insights
- JSON export for API integration
- DORA metrics calculation:
- Deployment frequency
- Lead time for changes
- Mean time to recovery
- Change failure rate
- GitHub PR enrichment (optional)
- Branch to project mapping
- YAML configuration with environment variable support
- Progress bars for long operations
- Anonymization support for reports
- Repository definitions with project keys
- Story point extraction patterns
- Developer identity similarity threshold
- Manual identity mappings
- Default ticket platform specification
- Branch mapping rules
- Output format selection
- Cache TTL configuration
- Clear CLI with helpful error messages
- Comprehensive documentation
- Sample configuration files
- Progress indicators during analysis
- Detailed logging of operations