Add ARCHITECTURE.md with a Mermaid component interaction diagram and short descriptions of the main runtime flows. Move CHANGELOG.md and ROADMAP.md under docs/ so project documentation lives in one place, and update README links plus the project layout description.
2.8 KiB
PySentry Architecture
This document shows the current component interaction model. PySentry is still a single desktop process: the GUI, scheduler, storage, and command runner live in one application and communicate through Go function calls and shared in-memory job state.
Component Diagram
flowchart LR
user["Desktop user"]
gui["src/gui\nFyne windows, tabs, dialogs"]
store["src/core Store\nYAML config and jobs"]
scheduler["src/core Scheduler\n@every and cron timing"]
runner["src/core Runner\nshell command execution"]
autostart["src/core Autostart\nWindows Run / Linux desktop startup"]
config["pysentry.yaml\napplication settings"]
jobs["jobs.yaml\njob definitions"]
logs["logs_dir\nper-run command output logs"]
shell["Platform shell\ncmd.exe /C or sh -c"]
user -->|"edits jobs, settings, runs commands"| gui
gui -->|"OpenStore, SaveConfig, SaveJobs"| store
store -->|"read/write"| config
store -->|"read/write"| jobs
gui -->|"Start, Pause, RunNow, RefreshSchedule"| scheduler
scheduler -->|"SaveJobs after state changes"| store
scheduler -->|"RunJob(trigger)"| runner
runner -->|"execute command"| shell
runner -->|"write stdout/stderr log"| logs
runner -->|"RunRecord with status, duration, log path"| scheduler
scheduler -->|"onChange RunRecord"| gui
gui -->|"display History, command output, job state"| user
gui -->|"SetAutostart, AutostartStatus"| autostart
autostart -->|"use executable path from resolved Paths"| config
Main Flows
-
Startup: The executable starts
cmd/pysentry, which calls the GUI package. The GUI opens the store, loadspysentry.yamlandjobs.yaml, creates the main tabs, then starts the scheduler with the loaded job slice. -
Editing settings or jobs: The GUI updates the in-memory job/config state and asks
Storeto write YAML back to disk. Job definitions stay in onejobs.yaml; runtime command output is not stored there. -
Scheduled run:
Schedulerchecks due jobs on a one-second ticker. When a job is due, it marks the job as running, saves state, and startsRunnerasynchronously. -
Manual run:
Run nowcalls the same scheduler path as scheduled execution, but the resulting history record uses theManualtrigger. -
Command execution:
Runnerexecutes the command through the platform shell, captures stdout and stderr, writes one timestamped.logfile, and returns aRunRecord. -
History update: The scheduler receives the
RunRecord, updates the matching job, saves YAML, runs log cleanup, and calls the GUI callback so theHistorytab refreshes. -
Autostart: The Settings tab calls the platform autostart implementation. Windows uses the current user's Run registry key. Linux uses a desktop-session startup entry.