How to Configure the Daemon watch.toml for Multiple Repositories in code-review-graph
To configure the daemon watch.toml for multiple repositories, create or edit ~/.code-review-graph/watch.toml and define separate [[repos]] tables for each codebase, specifying the absolute path and an optional alias, while the ConfigWatcher automatically reloads changes without restarting the service.
The code-review-graph daemon monitors local repositories for code review graph generation through a centralized TOML configuration file. To configure the daemon watch.toml for multiple repositories, you populate this file with repository entries and global settings that control polling behavior and logging, all parsed by the load_config() function in code_review_graph/daemon.py.
Location and Structure of watch.toml
The daemon reads its configuration from ~/.code-review-graph/watch.toml (line 41 in code_review_graph/daemon.py). This file uses TOML format with top-level keys for global daemon settings and array-of-tables syntax for repository definitions.
Required Repository Fields
Each repository entry is a TOML table of the form [[repos]] containing specific fields validated at startup:
- path: Absolute or tilde-expanded path to the repository root. The daemon validates that the directory exists and contains a VCS marker (
.git,.svn, or.code-review-graphfolder) before accepting it (lines 27‑38). - alias: Human-readable identifier for the repository. If omitted, the daemon falls back to the directory name using
repo_path.name(lines 45‑46).
Optional Global Settings
The daemon supports three optional top-level configuration keys with sensible defaults (lines 66‑73):
- session_name: Logical name used in log messages (defaults to
"crg-watch"). - log_dir: Directory where per-repository log files are written (defaults to
"~/.code-review-graph/logs"). - poll_interval: Seconds between file-system polls when the watchdog library is unavailable.
Example Configuration for Multiple Repositories
To monitor multiple codebases simultaneously, append additional [[repos]] tables to the same file:
# ~/.code-review-graph/watch.toml
session_name = "crg-watch"
log_dir = "~/.code-review-graph/logs"
poll_interval = 2
[[repos]]
path = "/home/alice/project-alpha"
alias = "alpha"
[[repos]]
path = "/home/alice/project-beta"
alias = "beta"
[[repos]]
path = "/home/alice/project-gamma"
# alias omitted → defaults to "project-gamma"
When the daemon starts, load_config() (lines 84‑92) parses this configuration and spawns a separate code-review-graph watch child process for each repository entry. The daemon persists child PIDs to ~/.code-review-graph/daemon-state.json for cross-process status queries (lines 56‑58).
Validating Repository Paths
Before spawning watchers, the daemon validates each repository path according to the logic in code_review_graph/daemon.py. The directory must exist and contain a version control marker. Accepted markers include .git directories, .svn folders, or a .code-review-graph folder indicating a valid repository root (lines 27‑38).
Managing Repositories via CLI
Instead of manual editing, use the crg-daemon CLI to modify the configuration programmatically.
Adding a repository:
crg-daemon add /home/alice/project-delta --alias delta
Removing a repository:
crg-daemon remove beta
Inspecting current configuration:
crg-daemon status
These commands update watch.toml safely while the daemon is running.
Dynamic Configuration Reloading
The daemon implements a ConfigWatcher that monitors watch.toml for modifications (lines 77‑88). When you add, remove, or update repository entries, the daemon reconciles these changes automatically—starting new watchers for added repositories and terminating processes for removed ones—without requiring a service restart.
Summary
- File location: Configure repositories in
~/.code-review-graph/watch.tomlas read by the daemon at line 41 incode_review_graph/daemon.py. - Entry format: Use
[[repos]]tables with requiredpathand optionalaliasfields. - Path validation: Repositories must contain
.git,.svn, or.code-review-graphmarkers before the daemon accepts them (lines 27‑38). - Global options: Set
session_name,log_dir, andpoll_intervalat the top level to control daemon behavior (lines 66‑73). - Hot reloading: The
ConfigWatcherdetects file changes and updates running watchers dynamically, eliminating the need for restarts (lines 77‑88).
Frequently Asked Questions
Where is the watch.toml file located?
The daemon expects the configuration file at ~/.code-review-graph/watch.toml according to line 41 in code_review_graph/daemon.py. This path is hardcoded as the default location for the daemon's global settings and repository list, and the daemon creates the parent directory if it does not exist.
What happens if I omit the alias field?
If the alias field is missing from a [[repos]] entry, the daemon extracts the final directory component from the path using repo_path.name and uses that string as the identifier (lines 45‑46). This ensures every monitored repository has a human-readable reference even without explicit configuration.
Can I add repositories without editing the file manually?
Yes. The crg-daemon CLI provides add and remove subcommands that safely modify watch.toml programmatically. For example, running crg-daemon add /path/to/repo --alias myproject appends the repository to the configuration and triggers the daemon's file watcher to spawn a new monitoring process immediately.
How does the daemon handle configuration changes?
The ConfigWatcher class monitors watch.toml for filesystem events (lines 77‑88). When the file changes, the daemon reloads the configuration via load_config() and reconciles the active child processes—starting new watchers for added repositories and stopping those for removed entries—without requiring a service restart.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →