diff --git a/pyproject.toml b/pyproject.toml index 9ebbd08..e41690c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,6 +27,14 @@ dev = [ "mypy>=1.10", "types-paramiko", ] +web = [ + "fastapi>=0.115", + "uvicorn[standard]>=0.30", + "jinja2>=3.1", + "authlib>=1.3", + "itsdangerous>=2.2", + "httpx>=0.27", +] [project.scripts] ci-orchestrator = "ci_orchestrator.__main__:cli" diff --git a/src/ci_orchestrator/operations/__init__.py b/src/ci_orchestrator/operations/__init__.py new file mode 100644 index 0000000..d46e66d --- /dev/null +++ b/src/ci_orchestrator/operations/__init__.py @@ -0,0 +1,6 @@ +"""Pure operations layer shared by the CLI and the web UI. + +No ``click``, no ``print``, no presentation I/O — every function here +returns a dataclass and is safe to import from either a CLI command +wrapper or a web route. +""" diff --git a/src/ci_orchestrator/web/__init__.py b/src/ci_orchestrator/web/__init__.py new file mode 100644 index 0000000..7a642f1 --- /dev/null +++ b/src/ci_orchestrator/web/__init__.py @@ -0,0 +1,4 @@ +"""Web UI package: FastAPI app, auth, and routes for VM/host management. + +Depends on the optional ``[web]`` extra; the CLI core stays dep-light. +""" diff --git a/tests/python/test_web_scaffold.py b/tests/python/test_web_scaffold.py new file mode 100644 index 0000000..99a2107 --- /dev/null +++ b/tests/python/test_web_scaffold.py @@ -0,0 +1,17 @@ +"""Scaffold smoke test for the W0 packages: operations/ and web/. + +Just proves both packages import cleanly. No logic lives here yet. +""" + +from __future__ import annotations + +import ci_orchestrator.operations as operations +import ci_orchestrator.web as web + + +def test_operations_package_imports() -> None: + assert operations is not None + + +def test_web_package_imports() -> None: + assert web is not None