Jobs engine for the Starfleet system. Allows the assistant to schedule one shot or recurrent activities through MCP exposed tools.
  • Python 98.9%
  • Shell 1.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Troed Sångberg ac6c09bb59
All checks were successful
CI / Sanity check (ubuntu-latest) (push) Successful in 24s
chore: scrub internal identifiers from tracked files (public repo hygiene)
- config: agent default_host/ssh_user now empty (server-side must set them)
- deploy.sh: SERVER_HOST/USER/REPO_DIR required in environment
- roster.toml.example, README, AGENTS.md, spec: placeholders only
- move build plan to SDD workspace (kept local, not committed)
- AGENTS.md: document public repo hygiene workflow
2026-08-25 22:51:20 +02:00
.forgejo/workflows fix: run CI on devel pushes 2026-08-25 11:55:13 +02:00
docs/superpowers/specs chore: scrub internal identifiers from tracked files (public repo hygiene) 2026-08-25 22:51:20 +02:00
scripts chore: ops — user units, deploy.sh, CI, AGENTS.md, README, sample scripts 2026-08-25 11:52:15 +02:00
src/roster chore: scrub internal identifiers from tracked files (public repo hygiene) 2026-08-25 22:51:20 +02:00
systemd chore: ops — user units, deploy.sh, CI, AGENTS.md, README, sample scripts 2026-08-25 11:52:15 +02:00
tests chore: scrub internal identifiers from tracked files (public repo hygiene) 2026-08-25 22:51:20 +02:00
.gitignore feat: repo scaffold, pyproject, strict TOML config loader 2026-08-25 08:22:17 +02:00
AGENTS.md chore: scrub internal identifiers from tracked files (public repo hygiene) 2026-08-25 22:51:20 +02:00
deploy.sh chore: scrub internal identifiers from tracked files (public repo hygiene) 2026-08-25 22:51:20 +02:00
LICENSE feat: repo scaffold, pyproject, strict TOML config loader 2026-08-25 08:22:17 +02:00
pyproject.toml chore: scrub internal identifiers from tracked files (public repo hygiene) 2026-08-25 22:51:20 +02:00
README.md chore: scrub internal identifiers from tracked files (public repo hygiene) 2026-08-25 22:51:20 +02:00
roster.toml.example chore: scrub internal identifiers from tracked files (public repo hygiene) 2026-08-25 22:51:20 +02:00
uv.lock fix: run MCP client calls off the event loop 2026-08-25 11:21:09 +02:00

roster

Resident scheduler for the home network. script, llm and agent jobs, created by you from the CLI or by LLM agents over MCP; results land in output files and ntfy.

Design doc: docs/superpowers/specs/2026-08-24-roster-design.md.

Architecture

Two systemd user units on the server host:

  • roster serve — FastAPI JSON API on :4020 plus the 30 s tick loop. Owns the SQLite store (WAL) and runs every job.
  • roster mcp — streamable-HTTP MCP server on :4021 whose eight tools are thin HTTP calls to the API.

The CLI is a thin client too. One mutation path: everything goes through the service process.

Job types:

type runs
script an allowlisted executable under [scripts] dir (optional gate script first)
llm one chat completion against an OpenAI-compatible endpoint
agent opencode run --agent <name> on the workstation over SSH

Schedules: interval (30m, 2h), cron (5-field), at (one-shot; fires immediately when the time is now/past).

Semantics worth knowing: catch-up window 900 s (older due events are recorded as skipped(misfire)); no overlapping runs; unreachable LLM endpoint defers instead of failing (one alert per episode, completion notes "after N deferrals"); 3 consecutive failures alert once; [SILENT] in llm/agent output suppresses ntfy but not the file.

Quickstart

uv sync --group dev
cp roster.toml.example ~/.config/roster/roster.toml   # then edit ntfy_url/token
mkdir -p ~/.config/roster/scripts
export SERVER_HOST=... SERVER_USER=... SERVER_REPO_DIR=...  # deploy target
./deploy.sh                                            # installs + starts both units

roster selftest
roster add --id ping --type script --interval 30m \
    --script-path ~/.config/roster/scripts/sample_ping.sh
roster list
roster runs ping

CLI

roster add | list | show | update | pause | resume | run | rm | runs, plus serve, mcp, selftest, doctor [--reset-locks].

MCP clients

Computer (mcp.json):

{ "type": "http", "url": "http://<server-host>:4021/mcp" }

Workstation opencode: add the same URL as a remote MCP server. Agents can then schedule work; allow_agent_scheduling = false rejects all mutating requests from non-CLI clients.

Operations

journalctl --user -u roster -n 100      # engine/API logs
journalctl --user -u roster-mcp -n 100  # MCP logs
roster doctor                           # integrity check
roster doctor --reset-locks             # repair stale running rows