6.9 KiB
gemini.md
Project Overview
This project is a Windows background application written in Python that automatically monitors a selected Git repository directory and performs commits whenever files change.
The application is intended for environments where users are not expected to interact with Git manually (e.g. CNC operators). All commits are handled automatically.
The application runs silently in the background with a system tray icon and Windows notifications.
The final application must be packaged using PyInstaller as a single executable file with no console window.
Core Features
Background Operation
- The application runs in the background.
- No console window should be visible.
- A system tray icon must be present in the Windows taskbar notification area.
The tray icon menu must contain:
- Select Repository Folder
- Exit Application
Git Monitoring Behavior
The application monitors a selected folder that contains a Git repository.
Every filesystem change triggers an automatic commit.
.gitignore Support
The application respects .gitignore rules of the repository. Files matched by ignore rules will not trigger any actions or commits.
The following actions must be detected: ...
rename: part_v1.nc -> part_v2.nc
Git Operations
Commits must be executed automatically using Git. ...
Windows Notifications
The application should generate Windows toast notifications for:
- repository monitoring started
- repository monitoring stopped
- commit created
- errors
Example notification:
Git Monitor
modify: program.nc committed
Logging
The application must write logs to a file.
Log file requirements:
-
log filename:
git_monitor.log -
stored in the application directory
-
log levels:
- INFO
- WARNING
- ERROR
Logged events:
- application start
- repository selected
- detected file change
- git commit executed
- errors and exceptions
System Tray UI
The application must provide a tray icon.
Right-click menu:
Git Monitor
────────────
Select Repository
Exit
Behavior:
Select Repository
Opens a folder selection dialog.
Once selected:
- verify
.gitdirectory exists - start monitoring
Exit
Stops monitoring and terminates the application.
Application Architecture
The application must be modular and structured using classes.
Recommended project structure:
git_monitor/
main.py
tray_app.py
git_manager.py
file_watcher.py
notifier.py
config.py
logger.py
Modules
main.py
Application entry point.
Responsibilities:
- initialize logging
- initialize tray application
- start event loop
Main class:
Application
tray_app.py
Handles the system tray icon and menu.
Recommended library:
pystray
Responsibilities:
- create tray icon
- handle menu events
- start/stop monitoring
Main class:
TrayApp
Methods:
select_repository()
start_monitoring()
stop_monitoring()
exit_app()
file_watcher.py
Responsible for filesystem monitoring.
Recommended library:
watchdog
Main class:
RepositoryWatcher
Responsibilities:
- monitor filesystem events
- translate events to actions
- send events to GitManager
Handled events:
on_created
on_modified
on_deleted
on_moved
git_manager.py
Handles all Git operations.
Recommended library:
GitPython
Main class:
GitManager
Responsibilities:
- validate repository
- stage changed files
- perform commits
Methods:
is_git_repository(path)
commit_change(action, file)
Commit format:
f"{action}: {file}"
notifier.py
Responsible for Windows notifications.
Recommended library:
win10toast or plyer
Main class:
Notifier
Methods:
notify(title, message)
logger.py
Handles application logging.
Use Python logging module.
Features:
- file logging
- timestamp
- log levels
Log format example:
2026-03-06 18:32:11 INFO Repository monitoring started
2026-03-06 18:32:20 INFO modify: program.nc committed
config.py
Stores application configuration.
Possible stored data:
- last used repository path
Config file format:
config.json
Example:
{
"repository_path": "C:/cnc/programs"
}
Project Status: Completed
The application is fully implemented and tested for Windows 11 background operation.
Current Architecture (Finalized)
The project is structured as a proper Python package to ensure compatibility with PyInstaller and robust path handling.
auto-git/
├── run.py # Main entry point for Python/PyInstaller
├── git_monitor/ # Main package
│ ├── __init__.py # Package marker
│ ├── main.py # Application lifecycle
│ ├── tray_app.py # System tray (pystray) + UI (tkinter)
│ ├── git_manager.py # Git operations (GitPython)
│ ├── file_watcher.py # Filesystem monitoring (watchdog)
│ ├── notifier.py # Windows notifications (plyer + win10toast fallback)
│ ├── config.py # Persistent configuration (config.json)
│ ├── logger.py # Application logging (git_monitor.log)
│ └── requirements.txt # Dependency list
└── .gitignore # Project ignore rules
Implemented Solutions & Fixes
1. UI Responsive Fix (Windows 11)
To prevent the application from freezing during folder selection:
- Threading:
pystrayruns in a separate background thread. - Main Loop:
tkinter.mainloop()runs in the main thread to handle system dialogs properly. - Non-blocking Dialogs: Folder selection is scheduled via
root.after(0, ...)to ensure it doesn't block the tray icon.
2. PyInstaller Compatibility
- Package Imports: All internal imports use absolute paths (e.g.,
from git_monitor.logger import ...). - Path Management:
logger.pyandconfig.pyusesys.frozendetection to ensure data files are always located relative to the.exefile, not temporary directories. - Notification Robustness: Added a fallback mechanism in
notifier.py. Ifplyerfails to find a platform implementation (common in isolated environments), it automatically switches towin10toast.
Build Instructions
To generate the standalone executable, use the following command from the project root:
pyinstaller.exe --onefile --noconsole --name git-monitor --hidden-import="plyer.platforms.win.notification" run.py
Build Parameters:
--onefile: Packages everything into a single.exe.--noconsole: Hides the command prompt window during execution.--hidden-import: Manually includes the dynamic notification module for Windows.
Runtime Files
- Log File:
git_monitor.log(created in the same folder as the.exe). - Config File:
config.json(created in the same folder as the.exe).