Files
goddard bfd6771a9a
admin-web / build (push) Successful in 22s
backend / test (push) Failing after 52s
mistpipe / test (push) Successful in 10s
admin-web / build-and-push (push) Failing after 5s
backend / build-and-push (push) Has been skipped
Initial Mist scaffold
Successor to the Josh Steam prototypes. Single-VM Docker Compose stack with
the load-bearing core/ logic ported from JoshSteam CDN with bug fixes.

Contents:
- backend/  FastAPI + Celery (same image, two entrypoints)
            core/  hdiff, librsync, chain_replay, manifest, compression,
                   discord, steam, unrealpak, paths
            api/   auth, catalog, admin, builds (skeletons) + downloads (real)
            worker/  Celery factory replacing the missing prototype Tasks/__init__.py
            db/    SQLAlchemy models + Alembic initial migration
- admin-web/  SvelteKit + Tailwind skeleton
- client/    Tauri 2 + Svelte skeleton (Mist placeholder UI)
- mistpipe/  click-based admin CLI with subcommand stubs
- docs/      ARCHITECTURE, DECISIONS (9 ADRs), RUNBOOK
- docker-compose.yml + dev overlay + .github/workflows

Bugs fixed during port:
- Routes/download.py:2 stray backslash on import line
- Utils/celery.py inspect.reserved() missing parens + double active() typo
- Hardcoded OneDrive/Desktop paths replaced with pydantic-settings config
- Discord webhook URL + RabbitMQ password moved to env vars
- Missing Tasks/__init__.py reconstructed as worker/__init__.py

Out of scope for this commit: route bodies, UI screens, mistpipe subcommand
bodies, real image builds.
2026-06-07 19:39:25 -04:00

66 lines
1.3 KiB
TOML

[build-system]
requires = ["setuptools>=68", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "mist"
version = "0.1.0"
description = "Mist backend — FastAPI app + Celery worker for the Mist private game distribution platform"
readme = "../README.md"
requires-python = ">=3.12"
license = { text = "Proprietary" }
authors = [{ name = "Josh" }]
dependencies = [
# Web framework
"fastapi>=0.115",
"uvicorn[standard]>=0.32",
"python-multipart>=0.0.12", # multipart form parsing for builds upload
"pydantic>=2.9",
"pydantic-settings>=2.6",
# DB / migrations
"sqlalchemy>=2.0",
"alembic>=1.13",
"psycopg[binary]>=3.2",
# Auth
"argon2-cffi>=23.1",
"python-jose[cryptography]>=3.3",
# Background work
"celery>=5.4",
"redis>=5.1",
"kombu>=5.4",
# Content / compression
"zstandard>=0.23",
"py7zr>=0.22",
# Outbound HTTP
"httpx>=0.27",
"requests>=2.32",
]
[project.optional-dependencies]
dev = [
"pytest>=8.3",
"pytest-asyncio>=0.24",
"ruff>=0.7",
"mypy>=1.13",
]
[tool.setuptools.packages.find]
where = ["src"]
[tool.ruff]
line-length = 110
target-version = "py312"
[tool.ruff.lint]
select = ["E", "F", "I", "B", "UP", "N"]
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src"]