left4me/docs/superpowers/plans
mwiegand 49992b3a26
refactor(repo): uv workspace + hatchling + layout restructure
Migrate from pip-install-e + setuptools to a uv workspace with a
committed uv.lock for deterministic deps. Switch both members to
hatchling, and move package sources into nested standard layout
(l4d2host/l4d2host/, l4d2web/l4d2web/) so builds work from a
read-only source tree — setuptools wrote egg-info to source under
the old layout, which broke uv sync on the root-owned /opt/left4me/src.

Local dev install: `pip install -e ./l4d2host -e ./l4d2web` -> `uv sync`.
.envrc switches from `layout python python3.13` to `use uv`. Python
pinned to 3.13 via .python-version.

l4d2web now declares its cross-dep on l4d2host explicitly via
[tool.uv.sources] (workspace = true). l4d2web/alembic.ini and
l4d2web/alembic/ stay at the project root (standard alembic layout).

Test fixes:
- tests/__init__.py added to both test dirs so pytest doesn't shadow
  l4d2host as a namespace package via outer-dir walk.
- 3 CWD-relative paths in tests (l4d2web/static/css/{tokens,layout}.css
  and js/sse.js) anchored to Path(__file__) so they survive layout
  changes.
- Two test_install.py tests now monkeypatch HOME to tmp_path so they
  stop silently mutating ~/.steam/sdk32 on every run.

628 tests pass under sandboxed `uv run pytest`.

Per docs/superpowers/plans/2026-05-15-uv-workspace-execution.md;
prereq for the ckn-bw bundle's uv-sync action (queued).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 22:04:29 +02:00
..
2026-04-22-l4d2-host-lib-v1.md feat(l4d2): add l4d2ctl host command boundary 2026-05-06 16:35:20 +02:00
2026-04-23-l4d2-web-app-v1.md feat(l4d2): add l4d2ctl host command boundary 2026-05-06 16:35:20 +02:00
2026-05-05-l4d2-host-smoke-test.md feat(l4d2): add l4d2ctl host command boundary 2026-05-06 16:35:20 +02:00
2026-05-06-l4d2-cli-host-client.md feat(l4d2): add l4d2ctl host command boundary 2026-05-06 16:35:20 +02:00
2026-05-06-l4d2-install-logging.md fix(deploy): add venv to PATH in left4me-web systemd service 2026-05-06 20:45:37 +02:00
2026-05-06-l4d2-job-pages-and-cancel.md feat(l4d2-web): add job pages and cancellation 2026-05-06 15:05:13 +02:00
2026-05-06-l4d2-web-auth-pages.md fix(l4d2-web): reject encoded unsafe redirects 2026-05-06 13:24:04 +02:00
2026-05-06-l4d2-web-queue-worker.md feat(l4d2): add l4d2ctl host command boundary 2026-05-06 16:35:20 +02:00
2026-05-06-l4d2-web-ui.md docs(l4d2-web): plan functional web ui 2026-05-06 11:34:23 +02:00
2026-05-06-l4d2host-step-logging.md fix(deploy): add venv to PATH in left4me-web systemd service 2026-05-06 20:45:37 +02:00
2026-05-06-left4me-deployment.md feat(deploy): add production-like test deployment 2026-05-06 19:30:10 +02:00
2026-05-06-server-port-constraint.md docs: add server port constraint implementation plan 2026-05-06 20:53:50 +02:00
2026-05-07-l4d2-global-map-overlays.md feat(l4d2-web): managed global map overlays with daily refresh 2026-05-08 08:05:14 +02:00
2026-05-07-l4d2-workshop-overlays.md docs(workshop): spec and plan for steam workshop overlays 2026-05-07 16:25:13 +02:00
2026-05-08-kernel-overlayfs-helper.md docs(specs): kernel overlayfs migration design + plan 2026-05-08 12:19:26 +02:00
2026-05-08-l4d2-script-overlays.md docs(specs): script overlay type — design + implementation plan 2026-05-08 15:27:14 +02:00
2026-05-08-l4d2-script-sandbox-v2-systemd.md docs(specs): script sandbox v2 — systemd-only design + plan 2026-05-08 16:46:13 +02:00
2026-05-08-l4d2-script-sandbox-v3-egress-filter.md docs(specs): script sandbox v3 — egress filter design + plan 2026-05-08 17:08:47 +02:00
2026-05-08-overlay-file-tree.md fix(l4d2-web): file tree fetches in plain JS — vendored htmx is a stub 2026-05-08 20:23:04 +02:00
2026-05-08-overlay-server-cfg-aliases.md feat(l4d2-web): per-overlay server.cfg aliases — expose checkbox + auto-exec 2026-05-09 01:26:31 +02:00
2026-05-09-l4d2-cpu-isolation.md docs(plans): l4d2 cpu isolation — implementation plan 2026-05-09 11:03:37 +02:00
2026-05-09-l4d2-server-host-perf-baseline.md docs(plans): l4d2 server host perf baseline — implementation plan 2026-05-09 09:39:12 +02:00
2026-05-09-l4d2-server-lifecycle-reboot-and-drift.md docs(plans): l4d2 server lifecycle reboot-and-drift — implementation plan 2026-05-09 12:21:59 +02:00
2026-05-09-overlay-umount-helper-namespace-pin.md docs: postmortem for the overlay-umount EBUSY rabbit hole 2026-05-09 15:50:41 +02:00
2026-05-10-l4d2-network-shaping.md docs(plans): l4d2 network shaping & marking — implementation plan 2026-05-10 00:10:40 +02:00
2026-05-11-profile-password-change-v1.md docs: plan for profile page with self-service password change 2026-05-11 21:41:25 +02:00
2026-05-11-workshop-auto-download.md docs/plan: trim retry-backoff tuple to match attempts-1 2026-05-11 23:21:10 +02:00
2026-05-12-server-live-state-display.md refactor(live-state): drop redundant ix_sps_server_recent index 2026-05-12 21:27:01 +02:00
2026-05-13-rcon-password-display-v1.md docs: add rcon password display implementation plan 2026-05-13 11:36:08 +02:00
2026-05-13-server-hostname-v1.md docs: add server hostname implementation plan 2026-05-13 14:21:30 +02:00
2026-05-14-overlay-idmap.md refactor(sandbox): collapse l4d2-sandbox user into left4me 2026-05-15 15:50:57 +02:00
2026-05-14-rcon-console.md docs(plan): RCON console on server detail page 2026-05-14 21:14:06 +02:00
2026-05-15-build-time-idmap.md refactor(sandbox): collapse l4d2-sandbox user into left4me 2026-05-15 15:50:57 +02:00
2026-05-15-deploy-dir-rethink.md spec(deploy-dir-rethink): plan + mark adjacent specs resolved 2026-05-15 12:05:53 +02:00
2026-05-15-deployment-responsibility.md plan(deployment-responsibility): mark Task 3 done 2026-05-15 19:30:35 +02:00
2026-05-15-hardening-refactor.md plan(hardening-refactor): implementation plan against the proven composition 2026-05-15 14:25:25 +02:00
2026-05-15-uid-collapse.md plan(uid-collapse): drop l4d2-sandbox user; handoff to next session 2026-05-15 15:39:51 +02:00
2026-05-15-uv-workspace-execution.md refactor(repo): uv workspace + hatchling + layout restructure 2026-05-15 22:04:29 +02:00