Aider-style watch mode for pi. Watch any folder for source file saves — when a line ending with #pi! is detected, it's automatically sent to the LLM as a prompt.
pi install npm:pi-file-watcherStart watching a directory (defaults to . if no path given):
/watch start
/watch start ./src
Then in any source file, add #pi! at the end of a comment line and save:
// refactor this function to use async/await #pi!# rename this variable to something descriptive #pi!-- optimise this query #pi!Pi picks it up instantly and starts working. The marker is automatically removed from the file when the task is complete.
Add a time annotation after #pi! to schedule the prompt instead of firing immediately:
// refactor this to use async/await #pi! @5m
// review this file for edge cases #pi! @2h
// clean up before standup #pi! @09:30
// come back to this tonight #pi! @18:00Relative formats: 30s, 5m, 2h, 1h30m
Absolute format: HH:MM local time (schedules next day if already past)
If you save again before the timer fires, the old job is cancelled and re-evaluated from the new file content. Use /watch cancel to cancel manually.
Launch pi and start watching immediately with --watch:
pi --watch ./src
pi --watch ./src --marker "#go!"Or persist it in your settings file (~/.pi/agent/settings.json for global, .pi/settings.json for project):
{ "flags": { "--watch": "./src", "--marker": "#go!" } }By default the watcher skips node_modules, .git, dist, build, and a handful of other common output dirs. Add more with --ignore (comma-separated, merged with the defaults):
pi --ignore "tmp,fixtures,__snapshots__"Or in settings:
{ "flags": { "--ignore": "tmp,fixtures" } }Set your preferred marker once via CLI flag — pi remembers it across sessions:
pi --marker "#go!"Or add it to your settings file:
{ "flags": { "--marker": "#go!" } }Change the marker for the current session only:
/watch marker #go!
| Command | Description |
|---|---|
/watch start [path] |
Start watching a directory (defaults to .) |
/watch stop [path] |
Stop watching one or all directories |
/watch status |
Show watched paths, marker, and pending deferred jobs |
/watch marker <marker> |
Change the trigger marker for this session |
/watch cancel [path] |
Cancel pending deferred job(s) |
When a trigger fires, the file watcher closes immediately — the OS drops any events that arrive while the LLM is processing. After the LLM finishes its turn, the watcher restarts fresh. This means no storage, no seen-set, no extra files — the OS kernel provides the deduplication guarantee. The same approach used by aider.
The LLM is also instructed to remove the #pi! marker from the file as part of completing the task, preventing accidental re-triggers on subsequent saves.
MIT