5.7 KiB
Premium Mechanic PWA — Implementation State
Last updated: 2026-05-16 (end of session 1)
What is done
| Phase | Task | Status | Artifact |
|---|---|---|---|
| 0 | Git infrastructure (Gitea + repos + feature branches) | ✅ DONE | repos exist, ssh keys configured |
| A | A1: Recon TaxiDashboard backend structure | ✅ DONE | docs/backend-layout-notes.md |
| A | A2: Caddy fragment for mechanic.pptaxi.ru |
✅ DONE | ops/Caddyfile.fragment |
| A | A3: MinIO CORS on pp-inspections bucket |
✅ DONE | ops/set-minio-cors.sh, applied, preflight 204 |
| A | A4: SQLAlchemy models (MechanicInspection, MechanicInspectionPhoto, MechanicDamageMarker) |
✅ DONE | commit be0553e on feat/mechanic-mvp |
Where things live
Repos (Gitea: http://100.64.0.9:3001/tremble7681)
| Repo | Local clone | Working branch |
|---|---|---|
mechanic-pwa |
c:\NewProject\PremiumDriverApp\ |
feat/mechanic-mvp |
taxi-dashboard |
c:\NewProject\taxi-dashboard\ |
feat/mechanic-mvp |
taxi-dashboard clone has two remotes: origin → Gitea, vds → SSH to /opt/sites/taxi-dashboard/ on 100.64.0.12 (for pulling back-and-forth with prod).
Reference paths (real, verified — see docs/backend-layout-notes.md)
Base,TimestampMixin→app.models.baseget_db→app.db(file:app/db/__init__.py)get_current_user→app.auth.depsUser→app.models.user- Auth flow: OAuth2 password + Bearer JWT (not PIN as plan originally said)
- DB init:
Base.metadata.create_allat startup (not Alembic) + inlineALTER TABLE ADD COLUMN IF NOT EXISTSinapp/main.pylifespan - Backend Docker container:
taxi-backend-green/taxi-backend-blue(blue/green) - MinIO container:
taxi-minio - Models registered in:
app/models/__init__.py(imports +__all__)
Naming clash decision
Existing app/api/inspections.py + model CarInspection (table car_inspections) hold vendor-imported read-only data from NaughtySoft. Our new tables use the mechanic_ prefix to coexist:
mechanic_inspections(modelMechanicInspection)mechanic_inspection_photos(modelMechanicInspectionPhoto)mechanic_damage_markers(modelMechanicDamageMarker)
Next task
Task B1 — Mechanic module skeleton with healthz endpoint
(From docs/superpowers/plans/2026-05-16-premium-mechanic-phase1.md Phase B.)
Working dir: c:\NewProject\taxi-dashboard (branch feat/mechanic-mvp already checked out)
What to do:
- Create new file
backend/app/api/mechanic.py(not a subpackage — TaxiDashboard uses flatapp/api/*.pyfiles):from fastapi import APIRouter router = APIRouter(prefix="/api/v1/mechanic", tags=["mechanic"]) @router.get("/healthz") async def healthz() -> dict[str, str]: return {"status": "ok"} - Register in
backend/app/main.py— addmechanicto thefrom app.api import (...)tuple and callapp.include_router(mechanic.router)where the other includes live. - Test: bring up the dev backend, hit
GET /api/v1/mechanic/healthz, expect{"status":"ok"}. - Commit + push.
Plan calls it Task B1 (see Phase B section in the plan).
How to resume in a new session
In a new Claude Code chat in c:\NewProject\, paste this prompt:
Продолжаем проект Premium Mechanic PWA.
Контекст:
- Spec: PremiumDriverApp/docs/superpowers/specs/2026-05-16-premium-mechanic-design.md
- План: PremiumDriverApp/docs/superpowers/plans/2026-05-16-premium-mechanic-phase1.md
- Backend layout: PremiumDriverApp/docs/backend-layout-notes.md
- Текущее состояние: PremiumDriverApp/docs/superpowers/STATE.md
Phase A полностью завершён (A1–A4, последний коммит be0553e). Следующая задача — Task B1 (mechanic module skeleton + healthz endpoint) из плана.
Используй subagent-driven-development skill. Прочитай STATE.md, спавни первого implementer-subagent на Task B1.
That prompt is the single entry point for the next session — Claude will read STATE.md, ground itself, and continue dispatching subagents from Task B1 onward.
Remaining roadmap (Phase 1 MVP)
- Phase B (4 tasks): module skeleton, models registered, schemas, auth deps
- Phase C (3 tasks): GET /me, GET /vehicles, GET /vehicles/{id}
- Phase D (3 tasks): inspections CRUD with carry-over markers logic
- Phase E (5 tasks): MinIO storage layer + presigned upload/confirm + 302 read + celery thumbnail
- Phase F (2 tasks): markers create/update/delete
- Phase G (5 tasks): Vite + React + Tailwind + shadcn + PWA scaffold
- Phase H (3 tasks): Login + Home + VehicleCard pages
- Phase I (6 tasks): CameraCapture + PhotoSlot + VehicleScheme + InspectionEditor + InspectionReview
- Phase J (4 tasks): e2e test + deploy backend + deploy frontend + smoke test
≈ 35 tasks left until MVP live on mechanic.pptaxi.ru.
Known external dependencies
- MinIO
pp-inspectionsbucket — CORS already configured, presigned uploads will work - Caddy on 100.64.0.12 — fragment ready, will be wired during Phase J deploy
- Docker blue/green deployment on VDS — backend re-deployment will need a touch of
docker compose(Phase J) - Frontend deployment target:
/opt/sites/mechanic-pwa/dist/on VDS (Phase J)
Conventions reminder
- All new code in
feat/mechanic-mvpbranches in both repos - All new tables use
mechanic_prefix - Don't touch existing
app/api/inspections.pyorapp/models/inspection.py(vendor-imported) - Backend tests are synchronous metadata-style for now (no async fixtures exist yet); when API endpoint tests start in Phase C, they'll need a real DB session — implementer-subagent should propose minimal
conftest.pyadditions if needed.