Files
manage/openspec/changes/service-registry/apply-progress.md
T
Developer c9c72be0b6 feat(services): cleanup, services admin UI, docs
PR 4a of the runtime service registry change.

- Remove addon pages (/addons/:addonId, AddonPage, addons/*) superseded by
  service pages.
- Remove grafana_url/prometheus_url from backend config, compose, .env.example,
  and README (URLs now live on service records; VITE_ frontend deep-link vars
  retained).
- Add Services page (/services) with create/list/delete + sidebar nav, so
  services are configurable in the tool itself and service pages are reachable.
- Update docs/REQUIREMENTS.md service-registry section; add CHANGELOG.md with
  the breaking-upgrade note (MANAGE_ENCRYPTION_KEY required; grafana/prometheus
  env vars removed; default widget seeding removed).

Verification: backend ruff clean, pytest 222 passed; frontend lint 0 errors,
build success, 70 tests passed.
2026-06-23 10:57:30 +00:00

2.9 KiB
Raw Blame History

Apply Progress: Runtime Service Registry

Change: service-registry Apply run: PRs #7#10 (Slices 14a) Date: 2026-06-19

Slices 13 (MERGED)

  • Slice 1 (#7): backend service foundation — encryption, integrations registry, services + service_task_runs tables, /api/services* CRUD.
  • Slice 2 (#8): backend widget rebind — service_id + widget_kind, ServiceRecord adapters, built-ins, SSH run logging, retired old widget registry.
  • Slice 3 (#9): frontend services runtime — types/API/hooks, frontend registry, ServicePage, route swap, reconciled widget components + config dialog.

Slice 4a — Cleanup + services admin UI + docs (this PR)

Completed tasks

  • Removed addon pages (/addons/:addonId, AddonPage.tsx, addons/*) — superseded by service pages.
  • Removed grafana_url / prometheus_url from config.py, both compose files, .env.example, and README. (Frontend VITE_GRAFANA_URL / VITE_PROMETHEUS_URL deep-link vars retained.)
  • Added a Services page (/services) with create/list/delete and a nav entry, so service pages are reachable and services are configurable in the tool itself.
  • Registered /services route in both route trees + sidebar nav.
  • Updated docs/REQUIREMENTS.md (service registry section) and added CHANGELOG.md with the breaking-upgrade note.

Decision resolved mid-slice

"Full machine migration" was scoped into 4a (cleanup) + 4b (Jellyfin/Jellyseerr migration) because removing machine-level Jellyfin/Jellyseerr fields is deeply coupled to the Media/Users/Files pages (load-bearing) and there is no jellyseerr service definition yet. 4a ships the safe cleanup + the services admin UI; 4b does the machine-app-field migration as its own reviewable change.

Files changed (Slice 4a)

  • Backend: config.py (removed grafana_url/prometheus_url).
  • Compose/env/docs: docker-compose.yml, docker-compose.dev.yml, .env.example, README.md, docs/REQUIREMENTS.md, CHANGELOG.md (new).
  • Frontend: new pages/ServicesPage.tsx; App.tsx (routes + nav); removed pages/AddonPage.tsx, addons/*.

Verification (Slice 4a)

cd backend
.venv/bin/ruff check .                                      # clean
PYTHONPATH=src .venv/bin/python -m pytest                   # 222 passed
cd ../frontend
npm run lint                                                # 0 errors
npm run build                                               # success
npm run test                                                # 70 passed

Remaining work

  • Slice 4b: add jellyseerr service definition; rewire dependencies.py Jellyfin/Jellyseerr resolution to the service registry; migrate the Media/Users/Files/Dashboard selector from machine_id to service instance; remove machine-level Jellyfin/Jellyseerr fields from settings_store.py, routers/settings.py, and the Settings UI.