feat: Add Continuous Delivery system with auto-commit and file watcher

Automatically commit and push changes to GitHub with zero manual intervention.

Features:
- File watcher mode: Auto-detects changes in real-time
- Timer mode: Commits at regular intervals (default 5 minutes)
- Smart exclusions: Ignores temp files, sessions, cache, db files
- Retry logic: Auto-retries failed pushes
- Change summaries: Detailed commit messages with file lists

Components:
- auto-deploy.ps1: Core CD engine with file watcher
- start-cd.ps1: Easy-to-use wrapper with commands
- .cd-config.json: Configuration file
- CONTINUOUS_DELIVERY_GUIDE.md: Complete documentation

Usage:
  .\start-cd.ps1 watch    # Start file watcher (recommended)
  .\start-cd.ps1 start    # Timer mode (every 5 min)
  .\start-cd.ps1 once     # One-time commit

Also removed db_data/ from git tracking (now in .gitignore).
Database runtime files should never be committed.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
SamiAhmed7777
2025-10-26 02:07:57 -07:00
parent d22b3e1c0d
commit 877b9347b6
207 changed files with 980 additions and 3658 deletions

View File

@@ -0,0 +1,428 @@
# EasyStream Continuous Delivery Guide
Automatically commit and push your changes to GitHub with zero manual intervention.
## Features
- **File Watcher Mode**: Detects file changes in real-time and auto-commits after 30 seconds of inactivity
- **Timer Mode**: Commits and pushes at regular intervals (default: 5 minutes)
- **Smart Exclusions**: Automatically excludes temporary files, sessions, cache, and database files
- **Retry Logic**: Automatically retries failed pushes with exponential backoff
- **Change Summaries**: Generates detailed commit messages with file change lists
- **Zero Configuration**: Works out of the box with sensible defaults
## Quick Start
### Option 1: File Watcher Mode (Recommended)
This mode monitors your files and automatically commits changes 30 seconds after you stop editing:
```powershell
.\start-cd.ps1 watch
```
You'll see:
```
========================================
EasyStream File Watcher Started
========================================
Watching: E:\repos\easystream-main
Branch: dev
Debounce: 30 seconds after last change
========================================
✓ File watcher active. Monitoring for changes...
```
When you save a file:
```
[14:23:45] Changed: setup.php
[14:23:47] Changed: f_core/config.href.php
[14:23:50] Changed: docker-compose.yml
Debounce period elapsed. Processing 3 changes...
Found 3 changed files
✓ Committed changes
✓ Successfully pushed to GitHub
```
### Option 2: Timer Mode
Commits and pushes at regular intervals (every 5 minutes by default):
```powershell
.\start-cd.ps1 start
```
Change the interval to 1 minute:
```powershell
.\start-cd.ps1 start -Interval 60
```
### Option 3: One-Time Commit
Manually trigger a single commit and push:
```powershell
.\start-cd.ps1 once
```
## Configuration
Edit [.cd-config.json](.cd-config.json) to customize behavior:
```json
{
"intervalSeconds": 300,
"branch": "dev",
"commitPrefix": "auto:",
"excludePatterns": [
"f_data/data_sessions/*",
"f_data/data_cache/_c_tpl/*",
".setup_complete",
"*.log",
"db_data/*",
"node_modules/*",
"vendor/*"
],
"enableNotifications": true,
"autoStart": false
}
```
### Configuration Options
| Option | Description | Default |
|--------|-------------|---------|
| `intervalSeconds` | Time between auto-commits (timer mode) | 300 (5 min) |
| `branch` | Git branch to push to | "dev" |
| `commitPrefix` | Prefix for auto-generated commit messages | "auto:" |
| `excludePatterns` | File patterns to ignore | See above |
| `enableNotifications` | Show Windows notifications (future) | true |
| `autoStart` | Start CD on system boot (future) | false |
## Commands Reference
### start-cd.ps1 Commands
```powershell
# Start file watcher mode
.\start-cd.ps1 watch
# Start timer mode (default interval: 5 minutes)
.\start-cd.ps1 start
# Start timer mode with custom interval (60 seconds)
.\start-cd.ps1 start -Interval 60
# Run one-time commit and push
.\start-cd.ps1 once
# Check git status
.\start-cd.ps1 status
# Stop all running CD processes
.\start-cd.ps1 stop
# Show help
.\start-cd.ps1 help
```
### auto-deploy.ps1 Advanced Usage
Direct script usage for advanced scenarios:
```powershell
# File watcher mode with verbose output
.\auto-deploy.ps1 -WatchMode -Verbose
# Timer mode with custom interval and branch
.\auto-deploy.ps1 -IntervalSeconds 120 -Branch main -Verbose
# Custom commit prefix
.\auto-deploy.ps1 -CommitPrefix "wip:" -IntervalSeconds 60
```
## How It Works
### File Watcher Mode
1. **Monitors**: Watches all files in the repository using .NET FileSystemWatcher
2. **Debounces**: Waits 30 seconds after the last file change to avoid committing partial edits
3. **Excludes**: Filters out temporary files based on `.gitignore` and config patterns
4. **Commits**: Stages all changes and creates a commit with file change summary
5. **Pushes**: Uploads to GitHub with retry logic
6. **Repeats**: Continues monitoring for the next change
### Timer Mode
1. **Checks**: Scans for changes at regular intervals
2. **Stages**: Adds all modified, new, and deleted files
3. **Commits**: Creates a timestamped commit with change summary
4. **Pushes**: Uploads to GitHub if there are new commits
5. **Waits**: Sleeps for the configured interval before next check
## Commit Message Format
Auto-generated commits include:
```
auto: Update at 2025-10-26 14:30:00
Changed files:
- setup.php
- docker-compose.yml
- f_core/config.href.php
- ... and 5 more files
🤖 Generated with Claude Code Continuous Delivery
Co-Authored-By: Claude <noreply@anthropic.com>
```
## Excluded Files
The following files are automatically excluded from commits:
- Session files: `f_data/data_sessions/sess_*`
- Cache files: `f_data/data_cache/_c_tpl/*`
- Setup marker: `.setup_complete`
- Database files: `db_data/*`
- Log files: `*.log`
- Dependencies: `node_modules/*`, `vendor/*`
- IDE files: `.vscode/*`, `.idea/*`
## Troubleshooting
### CD not detecting changes
**Problem**: Files changed but no commit triggered
**Solution**:
```powershell
# Check if files are excluded
git status
# Verify .gitignore doesn't over-exclude
cat .gitignore
# Check CD config
cat .cd-config.json
```
### Push failed: Authentication required
**Problem**: Git asks for credentials
**Solution**:
```powershell
# Set up Git credential helper (Windows)
git config --global credential.helper manager
# Or use SSH keys
git remote set-url origin git@github.com:SamiAhmed7777/easystream-main.git
```
### Multiple CD processes running
**Problem**: CD commits too frequently
**Solution**:
```powershell
# Stop all CD processes
.\start-cd.ps1 stop
# Restart with single instance
.\start-cd.ps1 watch
```
### Large files rejected by GitHub
**Problem**: `db_data/*` files are too large
**Solution**:
These files are already excluded in `.gitignore`. If they're already tracked:
```powershell
# Remove from git but keep locally
git rm --cached -r db_data/
git commit -m "Remove database files from tracking"
git push
```
## Running as Background Service
### Option 1: Windows Task Scheduler
1. Open Task Scheduler
2. Create Basic Task
3. Trigger: At system startup
4. Action: Start a program
- Program: `powershell.exe`
- Arguments: `-WindowStyle Hidden -File "E:\repos\easystream-main\start-cd.ps1" watch`
### Option 2: PowerShell Background Job
```powershell
# Start in background
Start-Job -ScriptBlock {
Set-Location "E:\repos\easystream-main"
.\start-cd.ps1 watch
}
# Check status
Get-Job
# View output
Receive-Job -Id 1 -Keep
# Stop
Stop-Job -Id 1
Remove-Job -Id 1
```
### Option 3: Screen/Tmux (Windows Terminal)
```powershell
# Open new Windows Terminal tab
wt -w 0 nt -d E:\repos\easystream-main powershell -NoExit -Command ".\start-cd.ps1 watch"
```
## Security Considerations
### What Gets Committed
- Application code (PHP, JavaScript, CSS)
- Configuration files (docker-compose.yml, .env templates)
- Documentation (Markdown files)
- SQL schema files
### What's Excluded
- Session data (user sessions)
- Cache (compiled templates)
- Database runtime files (actual data)
- Secrets (`.env` files are tracked but should only contain templates)
### Best Practices
1. **Review `.gitignore`**: Ensure sensitive files are excluded
2. **Use environment variables**: Never commit actual passwords or API keys
3. **Separate repos for secrets**: Use a private repo for production `.env` files
4. **Monitor commits**: Occasionally review auto-commits for unwanted files
## Performance Tips
### For Large Repositories
```json
{
"intervalSeconds": 600,
"excludePatterns": [
"f_data/*",
"uploads/*",
"*.mp4",
"*.mkv"
]
}
```
### For Active Development
```json
{
"intervalSeconds": 180,
"commitPrefix": "wip:"
}
```
## Integration with IDE
### VS Code
Add to `.vscode/tasks.json`:
```json
{
"version": "2.0.0",
"tasks": [
{
"label": "Start Continuous Delivery",
"type": "shell",
"command": ".\\start-cd.ps1 watch",
"presentation": {
"reveal": "always",
"panel": "dedicated"
},
"problemMatcher": []
}
]
}
```
Run with: `Ctrl+Shift+P``Tasks: Run Task``Start Continuous Delivery`
## FAQ
**Q: Will this commit every keystroke?**
A: No. File watcher mode waits 30 seconds after the last change before committing.
**Q: Can I customize commit messages?**
A: Yes, edit the commit message generation in [auto-deploy.ps1:176-188](auto-deploy.ps1#L176-L188)
**Q: Does this work with pull requests?**
A: Yes, but you may want to squash auto-commits before merging. Consider using a feature branch.
**Q: Can I run this on Linux/Mac?**
A: The scripts are PowerShell-specific. For Linux/Mac, use Git hooks or tools like `watchman` + bash scripts.
**Q: Will this conflict with manual commits?**
A: No. The CD system checks for changes and only commits if there are uncommitted files.
**Q: How do I temporarily pause CD?**
A: Press `Ctrl+C` in the CD terminal, or run `.\start-cd.ps1 stop`
## Examples
### Development Workflow
```powershell
# Morning: Start CD
.\start-cd.ps1 watch
# Work normally - changes auto-commit as you save
# End of day: Review commits
git log --oneline --since="8 hours ago"
# Squash if needed before PR
git rebase -i HEAD~20
```
### Emergency Hotfix
```powershell
# Stop CD
.\start-cd.ps1 stop
# Make critical fix
# ... edit files ...
# Manual commit with detailed message
git add .
git commit -m "fix: Critical security patch for XSS vulnerability"
git push
# Resume CD
.\start-cd.ps1 watch
```
## Support
For issues or questions:
- GitHub Issues: https://github.com/SamiAhmed7777/easystream-main/issues
- Check logs in terminal output
- Use `-Verbose` flag for detailed diagnostics
---
**Next Steps**: [Start using CD now!](#quick-start)