All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- SSH-only Git transport policy:
git config --global repos.transportPolicy ssh-onlyblocks effective HTTP(S) fetch and push URLs before credential helpers run, including macOS Keychain helpers. Transfer failures now name the repository and sanitized remote, provide an exact SSH conversion command for common hosts, and distinguish SSH key failures from transport fixes. - Fetch command:
repos fetchrefreshes every configured remote without changing local branches or worktrees and uses the same attributable, exclusive report contract as push/pull.
- Repository-oriented report sections are now sorted by path, grouping nested packages under their top-level project; nested package drift is sorted alphabetically by package, then by each copy's project path.
- Transfer and sync reports now combine failed, skipped, and local follow-up details into one project-grouped attention section with fixed-width
!,·, and~markers. Final reports also begin after a single visual break from progress output. - The source installer now builds and installs from one portable external Cargo target directory, respects
CARGO_TARGET_DIR, and no longer assumes a checkout-localtarget/path. - Repository discovery no longer inherits ignore files above the requested scan root, so a parent repository cannot hide child repositories from commands run inside that child directory tree.
- Status, publish, and nested mutation reports now name their outcomes, include checked totals, and provide paths and next steps where action is required.
repos doctornow emits a sorted summary with separate warnings/blockers, inspects both fetch and push URLs, skips HTTP access probes that could trigger credential helpers, and provides sanitized per-repo fixes.- Push and pull summaries now use exclusive outcome counts that add up to
Checked; skipped repositories are named with path/reason/next-step details, while local and nested work is explicitly non-exclusive follow-up. repos syncnow discovers repositories once and emits one combined pull/push report with exclusive per-repository outcomes.save,stage,unstage,commit, andconfignow use operation-specific summaries that name every changed or planned repository and give path/reason/next-step details for non-successes.- Push/pull report UX: Both transfer commands now use the same compact ANSI-colored report, name repositories and commit counts, deduplicate follow-up work, and keep nested drift as a short action list.
- Push progress: Concise mode names a repository when its operation is still running after 10 seconds instead of leaving only the last completed repository visible.
- HTTP credentials, URL user information, and query strings are redacted from Git failure reports.
- Secret and hygiene reports retain repository and file attribution, while
repos audit --jsonemits one redirect-safe JSON document even with dry-run fixes.
- Humane workflow commands: Added intent-first daily commands for managing a fleet like one project.
repos savestages tracked changes, commits, and pushes in one step.repos syncfetches and safely updates clean repositories with rebase semantics.repos doctordiagnoses auth, remotes, nested state, and required tooling.
- Nested repository UX: Added the
repos nestedcommand surface for nested repo drift management.
- CLI command model: Reframed the primary interface around
status,save, andsync, with granular Git commands kept for explicit control. - Safer push semantics: Replaced ambiguous force-style upstream behavior with
repos push --auto-upstream. - Safer sync behavior: Dirty repositories are skipped by default during sync instead of being mutated implicitly.
- Reporting parity: Push and pull now use operation-aware summaries.
- Pull reports pulled repositories and pulled commits instead of showing push counters.
- Diverged repositories are grouped separately from generic failures.
- Email privacy failures are grouped as push policy blocks.
- Missing upstream guidance now points to
repos push --auto-upstream.
- Documentation: Rewrote README and core docs around humane intent, safety defaults, and day-to-day workflows.
- Nested drift output: Automatic post-run drift checks no longer print a stray nested scan line when there is no drift to report.
- Test isolation: Fixed cwd restoration in blocking discovery tests so temporary directories cannot leak across tests.
- Subrepo command naming: Public-facing nested repository workflows now use
nestedterminology instead ofsubrepo. - Push upstream flag: Use
--auto-upstream; force-style naming is no longer the intended workflow.
- Git LFS support: Full support for Git Large File Storage in push and pull operations
- Automatic LFS detection via
.gitattributesandgit lfs ls-files - Pre-push LFS object upload to prevent incomplete operations
- Pre-pull LFS object fetch to avoid delays during checkout
- Clear indicators in output ("with LFS" suffix on success messages)
- Handles LFS-enabled repositories transparently
- Automatic LFS detection via
- Subrepo sync testing: Integration test for subrepo synchronization functionality
- Validates sync across multiple parent repositories
- Tests commit targeting and verification
- Modular architecture: Major refactoring for extensibility and maintainability
- Package manager trait system replacing hardcoded enum (easy to add new package managers)
- Publish command split into focused modules (planner, executor, orchestrator)
- Hygiene audit module reorganized (rules, scanner, report separation)
- Net reduction of 710 lines of code while improving structure
- Code quality improvements: Comprehensive clippy pedantic fixes
- 471 warnings reduced to 185 (61% improvement)
- Modernized format strings (inline variable syntax)
- Removed redundant else blocks and improved variable naming
- Zero behavioral changes, pure refactoring
- Critical LFS issues: Addressed race conditions and error handling in LFS operations
- Security: Verified SHA256 checksum for TruffleHog installer script
- Compiler warnings: Eliminated all clippy warnings in strict mode
- Documentation: Removed outdated MODULE_BOUNDARIES.md, TESTING.md, and TEST_AUDIT_REPORT.md
- Package manager detection: Trait-based system enables compile-time optimization
- Parallel analysis: Improved concurrency in publish command planning phase
- Package renamed:
repos→goobits-reposfor better namespace clarity- Library name changed from
repostogoobits_repos - Binary name remains
repos(no breaking change for CLI users) - Migration: Update
Cargo.tomldependencies andusestatements togoobits_repos
- Library name changed from
- Pull command: New
repos pullcommand with safety checks and concurrency fixes- Automatic conflict detection and abort on merge conflicts
- Progress tracking with visual feedback
- Respects
--jobsand--sequentialflags
- Enhanced progress display: Show active repository names during fetch phase
- Slow repository warnings: Display elapsed time warnings for repos taking >10 seconds
- Test audit report: Comprehensive analysis of test suite quality and coverage gaps
- Zero panic risk: Eliminated all 59
unwrap()calls across production and test code- All 30 production unwraps replaced with proper error handling
- All 29 test unwraps replaced with descriptive
expect()messages - Created
path_to_str()helper for UTF-8 safe path handling - Used
total_cmp()for NaN-safe float sorting
- Dependencies updated: Major version updates for core dependencies
tokio1.48 (was 1.0) - Latest async runtime with performance improvementsclap4.5 (was 4.0) - Modern CLI argument parsingreqwest0.12.24 - Latest HTTP client with security fixesserde1.0.228 - Serialization with latest optimizationsflate21.1,indicatif0.18,tempfile3.23
- Test coverage: Increased from 63 to 107 tests (+70% improvement)
- Added 32 audit system tests (scanner, hygiene, fixes modules)
- Added 16 command tests (sync, staging operations)
- Removed 4 redundant tests testing Rust language features
- Coverage grade improved from D+ (38%) to B- (65%)
- Pipelined fetch+push: Optimized per-repo processing architecture
- Staggered fetch starts: Prevent connection bursts to git remotes (improved rate limiting)
- Overhauled progress tracking: Eliminated stuck/hanging progress bar appearance
- Zero compiler warnings: All Rust warnings eliminated
- Fixed AtomicU64 comparison errors in tests
- Resolved unused import warnings
- Added appropriate
#[allow]attributes for test infrastructure
- Critical safety fixes: Phase 2A safety and correctness improvements
- Progress bar updates: Fixed non-verbose mode fetch phase progress display
- Export visibility: Fixed
find_repos_from_pathexport for library usage - Test isolation: Disabled commit signing in tests to prevent GPG interference
- Error handling hardening: Eliminated all panic-prone unwrap calls
- Audit system testing: 100% test coverage for critical security scanning code
- Dependency updates: Latest versions include security patches
- --show-changes flag: Display file changes in repos with uncommitted changes using
repos push --show-changes(or-c)- Tree-style display with git status for each repo
- Limits to first 10 files per repo for clarity
- Combines with
--verbosefor detailed progress tracking
- 50-100x faster publish command: Reduced from 15 minutes to 10-20 seconds for 500+ repos
- Combined parallel analysis for visibility, package detection, and dirty status checks
- In-memory visibility caching to avoid repeated process spawning
- Async package detection using tokio::fs for non-blocking filesystem checks
- 2.5x faster overall runtime: Repository processing improved from ~3 minutes to ~1.2 minutes
- Parallelized repository discovery using up to 8 threads (5-10x faster)
- Removed artificial 12-operation concurrency cap to scale with CPU cores
- Increased publish concurrency from 3 to 8 operations
- DashMap for lock-free concurrent access (20-40% reduction in mutex contention)
- TruffleHog installer hardening: Fixed two medium-priority security issues
- Proper cleanup of test files in /usr/local/bin
- Eliminated pipe-to-shell pattern (curl | sh) in download script
- Verbose mode progress bars now update correctly after fetch phase (no more hanging)
- Async variable capture in push phase futures (verbose, timing, and stats now display properly)
- Removed CLI flags:
--fast,--safe, and--concurrencyreplaced with simplified--jobs Nand--sequential - Removed env var:
REPOS_CONCURRENCYno longer supported (use--jobsinstead) - Internal API changes: Module structure refactored with API facade pattern
- Constant renamed:
GIT_CONCURRENT_LIMIT→GIT_CONCURRENT_CAP
- Smart concurrency detection: Automatically uses
min(CPU_CORES + 2, 12)for optimal performance - Two-phase pipeline: Separate fetch (2x concurrency) and push (1x concurrency) phases for 2x performance improvement
- Rate limit protection: Automatic GitHub rate limit detection with retry logic (2-second backoff)
- ARCHITECTURE.md: Comprehensive documentation of 3-layer architecture and module boundaries
- Subrepo drift integration:
repos pushnow automatically checks for subrepo drift with--no-drift-checkflag to disable - API facades:
core/api.rsandgit/api.rsfor clean public API (reduced from ~150 to ~30 exports)
- Concurrency configuration: Simplified from 6 options to 2 (
--jobs Nor--sequential) - Architecture: Refactored to 3-layer design (Commands → Core → Infrastructure)
- Module visibility: 29 functions marked
pub(crate)for internal use only - Documentation: Comprehensive overhaul for consistency and AI/tool navigation
- Export subrepo module in
lib.rsfor library usage - Visual clarity improvements in subrepo drift output
- 2x faster push operations through two-phase pipeline architecture
- Optimized repository discovery and processing
- Subrepo drift detection and synchronization
repos subrepo validate- Discover all nested repositoriesrepos subrepo status- Show drift with smart sync suggestionsrepos subrepo sync- Sync to specific commit with--stashflagrepos subrepo update- Update to latest from origin/main- Smart SYNC TARGET detection (latest clean commit)
- Problem-first output (shows only drifted subrepos by default)
- Visual indicators: ✅ clean,
⚠️ uncommitted, 🎯 SYNC TARGET, ⬆️ LATEST - Commit timestamp sorting to identify newest commits
- Groups by remote URL (not name) to avoid false positives
- Sync score calculation (0-100% synchronized)
--verboseflag for push command (detailed per-repo progress)
- Push command now shows live tally by default (cleaner output)
- Use
--verboseflag to see detailed per-repo progress bars
- Git commit command across repositories with
repos commit <message> --include-emptyflag to force empty commits- Repository visibility filtering to
repos publishcommand --all,--public-only,--private-onlyflags for publish command--tagflag to create and push git tags after successful publish--allow-dirtyflag to publish with uncommitted changes
repos publishnow filters to public repositories only by default- Auto-skip repositories with no staged changes when committing
- Only show uncommitted changes suffix for synced repos, not pushed
- Refresh git index before checking for uncommitted changes
- Git staging commands across repositories:
repos stage <pattern>- Stage files matching pattern in all reposrepos unstage <pattern>- Unstage files matching pattern in all reposrepos status- Show staging status across all repos
- Pattern support:
*.md,README.md,*(all files) - Concurrent execution with progress bars for staging operations
- Modern git commands (git restore --staged)
- Improved error handling and status reporting for git operations
- Comprehensive code quality improvements and refactoring
- Renamed
usercommand toconfigfor better semantics - Renamed
synccommand topushfor clarity
- Remove needless borrowing in TruffleHog installer
- Make validation functions available for testing
- Make CLI version dynamic
- Code formatting and style improvements
- Rename project from sync-repos to repos