In a fresh clone, start with:
bash scripts/setup-agent-links.sh
bash scripts/check-agent-links.shThen start the checkout-local stack:
uv run bash scripts/dev.sh start --random-ports
uv run bash scripts/dev.sh urlsMain commands:
uv run bash scripts/dev.sh start --random-ports
uv run bash scripts/dev.sh status
uv run bash scripts/dev.sh urls
uv run bash scripts/dev.sh stop
uv run bash scripts/dev.sh restart
uv run bash scripts/dev.sh down
uv run bash scripts/dev.sh recreate --random-ports
uv run bash scripts/dev.sh cleanupSemantics:
startcreates or resumes the checkout-local stackstatusshows the saved stack stateurlsprints the saved host portsstopstops the stack without deleting local staterestartforce-recreates the same stack on the same portsdownremoves the stack and the saved local staterecreate --random-portsrebuilds on fresh portscleanupremoves stale local state when the stack no longer exists
Each checkout keeps its own .devstack.env, Compose project name, and host
port allocation, so multiple worktrees can run side by side.
Create new worktrees through the repository wrapper:
bash scripts/wt-switch.sh --create <feature-name>Useful variants:
bash scripts/wt-switch.sh --create <feature-name> -x codex
bash scripts/wt-switch.sh --create <feature-name> -x claude
wt switch <feature-name>
wt switch -
wt list
wt removeBackend development container:
- runs
uv sync --frozen --package app - starts
fastapi run --reload app/main.py - reloads on backend source changes
Frontend development container:
- runs
bun install --frozen-lockfile --ignore-scripts - starts
bun run dev --host 0.0.0.0 --port 5173 - reloads on frontend source changes
Mounted sources:
- backend mounts
./backend, rootpyproject.toml, anduv.lock - frontend mounts
./frontend, rootpackage.json, andbun.lock
Normal code edits do not require image rebuilds. Rebuild only for Dockerfile or base image changes.
Backend:
uv sync --frozen --package app
uv run pytest
uv run bash backend/scripts/lint.shFrontend:
bun install --frozen-lockfile --ignore-scripts
cd frontend && bun run lint
cd frontend && bun run testThe host .venv does not conflict with the backend container, which uses a
Docker-managed /app/.venv.
Against a running dev stack:
set -a; source .devstack.env; set +a
docker compose exec -T backend sh -c 'cd /app/backend && bash scripts/tests-start.sh'Full containerized cycle:
bash scripts/test.shUseful checks:
set -a; source .devstack.env; set +a
docker compose logs -f backend taskiq-worker frontend
curl "http://localhost:${HOST_BACKEND_PORT}/api/v1/utils/health-check/"
curl "http://localhost:${HOST_FRONTEND_PORT}"- Source
.devstack.envbefore rawdocker composecommands. - Regenerate the frontend client when backend API contracts change.
- Keep generated frontend files out of manual edits.
- For realtime event work, apply
.agents/skills/realtime-events/SKILL.mdbefore implementation.