VibeWatch
A fast and extensible file watcher utility built in Rust with glob pattern support.
Features
- Cross-platform file watching: Uses the
notifycrate for efficient file system monitoring - Glob pattern support: Include and exclude files using glob patterns like
*.rs,node_modules/** - Extensible architecture: Clean separation of concerns for easy feature additions
- Fast performance: Built in Rust for minimal resource usage
- Flexible CLI: Intuitive command-line interface with verbose logging support
- Comprehensive testing: 95.77% code coverage with 187 tests covering unit, filesystem, and integration scenarios
Installation
Make sure you have Rust installed via mise:
# Install dependencies and build
Usage
Basic Usage
Watch a directory and log all file changes:
Include Patterns
Watch only specific file types:
Exclude Patterns
Ignore common directories and files:
Combined Patterns
Use both include and exclude patterns:
Options
<DIRECTORY>: Directory to watch (can be relative or absolute)-i, --include <PATTERN>: Include patterns like*.ts,*.tsx,*.rs-e, --exclude <PATTERN>: Exclude patterns likenode_modules/**,.git/**,.next/**-v, --verbose: Enable verbose output with debug logging-h, --help: Show help message-V, --version: Show version information
Examples
Watch TypeScript/JavaScript project
Watch Rust project
Watch documentation changes
Architecture
The application is structured for extensibility:
main.rs: CLI argument parsing and application entry pointwatcher.rs: Core file watching logic using thenotifycratefilter.rs: Glob pattern matching for include/exclude functionality
Common Glob Patterns
Exclude Patterns
node_modules/**- Node.js dependencies.git/**- Git repository files.next/**- Next.js build filestarget/**- Rust build directorydist/**- Build output directory*.tmp- Temporary files*.swp- Vim swap files
Include Patterns
*.rs- Rust source files*.ts,*.tsx- TypeScript files*.js,*.jsx- JavaScript files*.py- Python files*.go- Go files*.cpp,*.c,*.h- C/C++ files*.md- Markdown files
Future Enhancements
The current implementation logs file changes to the console. Future versions could include:
- Custom command execution on file changes
- HTTP webhook notifications
- File change aggregation and batching
- Configuration file support
- Plugin system for custom handlers
- Integration with development tools
Requirements
- Rust 1.70+ (managed via
mise) - Unix-like system (macOS, Linux) or Windows
Development
Quick Start with Just
The project uses just for task automation:
# Install just (if not already installed)
# or: brew install just
# List all available tasks
# Common tasks
Running Tests
# Run all tests (187 total: 140 unit + 21 filesystem + 26 integration)
# or: just test
# Run tests with output
# or: just test-verbose
# Run specific test suite
# or: just test-integration test_name
Code Coverage
The project maintains 95.77% code coverage (996/1040 lines):
# Generate coverage report
# View report
Coverage by file:
filter.rs: 100.00% (190/190) ✅main.rs: 98.05% (252/257) ✅watcher.rs: 93.42% (554/593) ✅
Note: The remaining 4.23% uncovered lines are in
main()andstart_watching()functions that run as subprocesses during integration tests. Coverage tools cannot track across process boundaries. These lines are functionally tested through our comprehensive integration test suite.
Development Commands
# Run with debug logging
RUST_LOG=debug
# Build for release
# Run linter
# Format code
Contributing
Commit Message Convention
This project uses Conventional Commits for automated versioning and changelog generation.
Format: <type>(<optional scope>): <description>
Types:
feat:- New feature (triggers minor version bump)fix:- Bug fix (triggers patch version bump)docs:- Documentation changeschore:- Maintenance tasksrefactor:- Code refactoringtest:- Adding or updating testsfeat!:orfix!:- Breaking changes (triggers major version bump)
Examples:
)
Release Process
Releases are automated via Release Please:
- Commit using conventional commits - Each commit to
masteris analyzed - Release PR is created - Release Please opens a PR with updated version and CHANGELOG
- Merge the Release PR - This triggers:
- GitHub Release creation
- Binary builds for Linux, macOS, Windows (x86_64, ARM64)
- Optional publish to crates.io (if
CARGO_TOKENsecret is configured)
Manual release: Just merge the automatically created "chore: release X.Y.Z" PR.
Setup Required: Release Please needs a Personal Access Token to create PRs. See docs/RELEASE_PLEASE_SETUP.md for detailed setup instructions.
CI/CD
All PRs and pushes to master run:
- ✅ Tests (187 tests on Linux, macOS, Windows)
- ✅ Formatting check (
cargo fmt --check) - ✅ Linting (
cargo clippy) - ✅ Coverage report (uploaded to Codecov)
Documentation
For comprehensive technical documentation:
- Release Please Setup:
docs/RELEASE_PLEASE_SETUP.md- Configure automated releases with PAT - Testing Guide:
docs/TESTING.md- Test organization, best practices, and quick reference - Coverage Analysis:
docs/COVERAGE.md- Detailed coverage metrics and industry benchmarks - Integration Tests:
docs/INTEGRATION_TEST.md- Testing research, rationale, and best practices - Justfile Guide:
docs/JUSTFILE_IMPLEMENTATION.md- Task runner implementation and benefits