Description
The PR commit message claims plugins are "hot-reloaded via a single recursive watcher on the plugins root." However, the actual implementation watches individual skill directories collected at startup, not the plugins root directory itself.
skill_paths() in src/bootstrap/mod.rs calls mgr.collect_skill_dirs() at startup, which enumerates skill dirs from already-installed plugins. These paths are passed to SkillWatcher::start(). If the agent is running and a new plugin is installed via /plugins add (slash command or TUI), its skill directories are not in the watcher list and no hot-reload event fires.
Reproduction Steps
- Start agent:
cargo run --features full -- --config .local/config/testing.toml
- While agent is running, install a plugin:
/plugins add /path/to/plugin
- Ask agent to use a skill from the newly installed plugin
- Observe: agent does not find the skill (registry not updated)
- Restart agent: skill is now available
Expected Behavior
Installing a plugin via /plugins add while the agent is running should trigger skill hot-reload within the standard debounce window (500ms), making the plugin's skills available without restart.
Actual Behavior
Plugin skills are only loaded at startup. Runtime plugin installs require an agent restart to take effect.
Root Cause
src/bootstrap/mod.rs:skill_paths() collects plugin skill dirs once at startup. SkillWatcher watches those fixed paths. When a new plugin is installed post-startup, no watcher covers its skill dir.
A correct implementation would watch the plugins root directory (~/.local/share/zeph/plugins/) recursively, or re-register the new skill dirs with the existing watcher on each /plugins add operation.
Environment
- Version: 0.19.1 (e1749ef)
- Features: full
- Session: CI-559, 2026-04-17
Description
The PR commit message claims plugins are "hot-reloaded via a single recursive watcher on the plugins root." However, the actual implementation watches individual skill directories collected at startup, not the plugins root directory itself.
skill_paths()insrc/bootstrap/mod.rscallsmgr.collect_skill_dirs()at startup, which enumerates skill dirs from already-installed plugins. These paths are passed toSkillWatcher::start(). If the agent is running and a new plugin is installed via/plugins add(slash command or TUI), its skill directories are not in the watcher list and no hot-reload event fires.Reproduction Steps
cargo run --features full -- --config .local/config/testing.toml/plugins add /path/to/pluginExpected Behavior
Installing a plugin via
/plugins addwhile the agent is running should trigger skill hot-reload within the standard debounce window (500ms), making the plugin's skills available without restart.Actual Behavior
Plugin skills are only loaded at startup. Runtime plugin installs require an agent restart to take effect.
Root Cause
src/bootstrap/mod.rs:skill_paths()collects plugin skill dirs once at startup.SkillWatcherwatches those fixed paths. When a new plugin is installed post-startup, no watcher covers its skill dir.A correct implementation would watch the plugins root directory (
~/.local/share/zeph/plugins/) recursively, or re-register the new skill dirs with the existing watcher on each/plugins addoperation.Environment