From f7448729fac2bc61ff6f654704b8df5ba1dd8776 Mon Sep 17 00:00:00 2001 From: h Date: Fri, 28 Aug 2026 02:16:43 +0200 Subject: [PATCH] chore(deps): local extra installs ../beaver-gateway editable, prod extra from git --- Makefile | 5 +- README.md | 7 +++ pyproject.toml | 22 +++++++-- uv.lock | 126 ++++++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 145 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index f5f7ea8..763920a 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,7 @@ -.PHONY: up recreate down restart rebuild gateway logs shell deploy +.PHONY: sync up recreate down restart rebuild gateway logs shell deploy + +sync: + uv sync --extra local up: docker compose up -d diff --git a/README.md b/README.md index 346f637..742d451 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,13 @@ docker compose up -d Set `PUBLIC_BASE_URL=https://` in beaver-agent's `.env`. For per-subdomain layout, rewrite the Caddyfile and pass full `public_base_url=...` per frontend in `config.py`. +## Editing config.py on the mac + +`make sync` installs `../beaver-gateway` editable (extra `local`), so +imports in `config.py` resolve against the checkout you are working on; +`uv sync --extra prod` pulls the gateway from git instead. Neither is used +by the image - the container builds the gateway itself. + ## Useful commands ```bash diff --git a/pyproject.toml b/pyproject.toml index 59eddda..0355bc5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,29 @@ -# only for config.py development +# Only for config.py development: the image builds beaver-gateway itself. +# `uv sync --extra local` - editable ../beaver-gateway; `--extra prod` - from git. [project] name = "beaver-agent" version = "0.1.0" requires-python = ">=3.13" dependencies = [ - "beaver-gateway[prod]", "raycast-api[discovery]", ] +[project.optional-dependencies] +local = [ + "beaver-gateway", +] +prod = [ + "beaver-gateway[prod]", +] + +[tool.uv] +conflicts = [ + [{ extra = "local" }, { extra = "prod" }], +] + [tool.uv.sources] -beaver-gateway = { git = "https://git.kotikot.com/beaver/beaver-gateway.git", branch = "main" } +beaver-gateway = [ + { path = "../beaver-gateway", editable = true, extra = "local" }, + { git = "https://git.kotikot.com/beaver/beaver-gateway.git", branch = "main", extra = "prod" }, +] raycast-api = { git = "https://git.kotikot.com/beaver/raycast-api" } diff --git a/uv.lock b/uv.lock index 841b80e..7bd823f 100644 --- a/uv.lock +++ b/uv.lock @@ -2,9 +2,16 @@ version = 1 revision = 3 requires-python = ">=3.13" resolution-markers = [ - "python_full_version >= '3.14'", - "python_full_version < '3.14'", + "python_full_version >= '3.14' and extra != 'extra-12-beaver-agent-local' and extra == 'extra-12-beaver-agent-prod'", + "python_full_version < '3.14' and extra != 'extra-12-beaver-agent-local' and extra == 'extra-12-beaver-agent-prod'", + "python_full_version >= '3.14' and extra == 'extra-12-beaver-agent-local' and extra != 'extra-12-beaver-agent-prod'", + "python_full_version < '3.14' and extra == 'extra-12-beaver-agent-local' and extra != 'extra-12-beaver-agent-prod'", + "extra != 'extra-12-beaver-agent-local' and extra != 'extra-12-beaver-agent-prod'", ] +conflicts = [[ + { package = "beaver-agent", extra = "local" }, + { package = "beaver-agent", extra = "prod" }, +]] [[package]] name = "aiofile" @@ -244,20 +251,33 @@ name = "beaver-agent" version = "0.1.0" source = { virtual = "." } dependencies = [ - { name = "beaver-gateway", extra = ["prod"] }, { name = "raycast-api", extra = ["discovery"] }, ] +[package.optional-dependencies] +local = [ + { name = "beaver-gateway", version = "0.1.0", source = { editable = "../beaver-gateway" } }, +] +prod = [ + { name = "beaver-gateway", version = "0.1.0", source = { git = "https://git.kotikot.com/beaver/beaver-gateway.git?branch=main#b83018b97e498a616debd12d2e6fe0f8a543cf56" }, extra = ["prod"], marker = "extra == 'extra-12-beaver-agent-prod'" }, +] + [package.metadata] requires-dist = [ - { name = "beaver-gateway", extras = ["prod"], git = "https://git.kotikot.com/beaver/beaver-gateway.git?branch=main" }, + { name = "beaver-gateway", marker = "extra == 'local'", editable = "../beaver-gateway" }, + { name = "beaver-gateway", extras = ["prod"], marker = "extra == 'prod'", git = "https://git.kotikot.com/beaver/beaver-gateway.git?branch=main" }, { name = "raycast-api", extras = ["discovery"], git = "https://git.kotikot.com/beaver/raycast-api" }, ] +provides-extras = ["local", "prod"] [[package]] name = "beaver-gateway" version = "0.1.0" source = { git = "https://git.kotikot.com/beaver/beaver-gateway.git?branch=main#b83018b97e498a616debd12d2e6fe0f8a543cf56" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version < '3.14'", +] dependencies = [ { name = "aiofile" }, { name = "aiohttp" }, @@ -270,12 +290,12 @@ dependencies = [ { name = "greenlet" }, { name = "itsdangerous" }, { name = "jinja2" }, - { name = "psycopg", extra = ["binary"] }, + { name = "psycopg", extra = ["binary"], marker = "extra == 'extra-12-beaver-agent-prod'" }, { name = "pydantic" }, { name = "pydantic-settings" }, { name = "python-frontmatter" }, { name = "sqlmodel" }, - { name = "uvicorn", extra = ["standard"] }, + { name = "uvicorn", extra = ["standard"], marker = "extra == 'extra-12-beaver-agent-prod'" }, { name = "uvloop" }, ] @@ -285,6 +305,71 @@ prod = [ { name = "raycast-api" }, ] +[[package]] +name = "beaver-gateway" +version = "0.1.0" +source = { editable = "../beaver-gateway" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version < '3.14'", +] +dependencies = [ + { name = "aiofile" }, + { name = "aiohttp" }, + { name = "aiosqlite" }, + { name = "anthropic" }, + { name = "anyio" }, + { name = "argon2-cffi" }, + { name = "claude-agent-sdk" }, + { name = "fastapi" }, + { name = "fastmcp" }, + { name = "greenlet" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "psycopg", extra = ["binary"], marker = "extra == 'extra-12-beaver-agent-local'" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "python-frontmatter" }, + { name = "sqlmodel" }, + { name = "uvicorn", extra = ["standard"], marker = "extra == 'extra-12-beaver-agent-local'" }, + { name = "uvloop" }, +] + +[package.metadata] +requires-dist = [ + { name = "aiofile", specifier = ">=3.11.1" }, + { name = "aiohttp", specifier = ">=3.13.5" }, + { name = "aiosqlite", specifier = ">=0.22.1" }, + { name = "anthropic", specifier = ">=0.103.0" }, + { name = "anyio", specifier = ">=4.13.0" }, + { name = "argon2-cffi", specifier = ">=25.1.0" }, + { name = "claude-agent-sdk", specifier = ">=0.2.146" }, + { name = "fastapi", specifier = ">=0.136.1" }, + { name = "fastmcp", specifier = ">=3.3.1" }, + { name = "greenlet", specifier = ">=3.5.0" }, + { name = "itsdangerous", specifier = ">=2.2.0" }, + { name = "jinja2", specifier = ">=3.1.6" }, + { name = "psycopg", extras = ["binary"], specifier = ">=3.3.4" }, + { name = "pydantic", specifier = ">=2.13.4" }, + { name = "pydantic-settings", specifier = ">=2.14.1" }, + { name = "python-frontmatter", specifier = ">=1.2.0" }, + { name = "raycast-api", marker = "extra == 'local'", editable = "../raycast-api" }, + { name = "raycast-api", marker = "extra == 'prod'", git = "https://git.kotikot.com/beaver/raycast-api.git" }, + { name = "sqlmodel", specifier = ">=0.0.38" }, + { name = "uvicorn", extras = ["standard"], specifier = ">=0.47.0" }, + { name = "uvloop", specifier = ">=0.22.1" }, +] +provides-extras = ["local", "prod"] + +[package.metadata.requires-dev] +dev = [ + { name = "aioresponses", specifier = ">=0.7.8" }, + { name = "pytest", specifier = ">=9.0.3" }, + { name = "pytest-asyncio", specifier = ">=1.3.0" }, + { name = "ruff", specifier = ">=0.15.13" }, + { name = "ty", specifier = ">=0.0.37" }, +] + [[package]] name = "cachetools" version = "7.1.3" @@ -365,6 +450,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] +[[package]] +name = "claude-agent-sdk" +version = "0.2.146" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "jsonschema" }, + { name = "mcp" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/08/a79f73aad2156f4518ae6e0fffbcdb403cd5347d62b994b005a0c9bb12fb/claude_agent_sdk-0.2.146.tar.gz", hash = "sha256:9e402548466018421cfd0725a7601e14d9e3e879276a6a4a877c5a2ff6633546", size = 344704, upload-time = "2026-08-27T22:25:46.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/e2/7618d7ffd3d4580d53d1147e7baba005c3bf4359d8bb8ab9beab62b5a0ec/claude_agent_sdk-0.2.146-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7bcb91dd34c2e0e5b4f006648d457bbfba9aa1e44cf2e5d02abb441dcbbaff98", size = 84087716, upload-time = "2026-08-27T22:25:50.846Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e6/004b957547e32f6df4948c3a5a3c06974c6c19539c357ebe40a1a23941d3/claude_agent_sdk-0.2.146-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:9285b3dd900376b045a06d2d6f5e19bfd96a3f6cb88d21166bb840aff14ee505", size = 88567306, upload-time = "2026-08-27T22:25:54.876Z" }, + { url = "https://files.pythonhosted.org/packages/37/fa/1c1cb847ff8a92f6ec9a0176a984ec1902cf6eab6c027fd45059d211a96d/claude_agent_sdk-0.2.146-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:ad536806e6c6fc1972ae3950b1bb171f1494e6f47002c24dbc68f19af1c34997", size = 94195787, upload-time = "2026-08-27T22:25:59.367Z" }, + { url = "https://files.pythonhosted.org/packages/60/f9/48aa74e5a85ebe11b916a99b053cc64f47bea8409ec2b9ada5b5a1169a7a/claude_agent_sdk-0.2.146-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:1f2bae0759f3962be2714c786c1a6961824c5ce3d4b7f44f0828191bd44ccebe", size = 94385743, upload-time = "2026-08-27T22:26:03.218Z" }, + { url = "https://files.pythonhosted.org/packages/0d/d4/ff986dc35330146cba60a1bb6ee3f521cdec25ccc0306ef359b9d0cb59c4/claude_agent_sdk-0.2.146-py3-none-win_amd64.whl", hash = "sha256:dc2c4773dc02492b52c74f957a059ecbc0aec7063bd1a16c039b78613194b3cf", size = 97049829, upload-time = "2026-08-27T22:26:08.701Z" }, +] + [[package]] name = "claude-code-api" version = "0.1.0" @@ -538,7 +642,7 @@ name = "fastmcp" version = "3.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "fastmcp-slim", extra = ["client", "server"] }, + { name = "fastmcp-slim", extra = ["client", "server"], marker = "extra == 'extra-12-beaver-agent-local' or extra == 'extra-12-beaver-agent-prod'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3b/a9/5c5a01b6abd5346bf60b97cfd29e4a86661940c27dd562bfcda07fd03519/fastmcp-3.3.1.tar.gz", hash = "sha256:979362ea557de42a5f40342563c7e4b236bcc8e7cd192715f50030695d1a71cd", size = 28681699, upload-time = "2026-05-15T15:50:39.673Z" } wheels = [ @@ -551,7 +655,7 @@ version = "3.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "platformdirs" }, - { name = "pydantic", extra = ["email"] }, + { name = "pydantic", extra = ["email"], marker = "extra == 'extra-12-beaver-agent-local' or extra == 'extra-12-beaver-agent-prod'" }, { name = "pydantic-settings" }, { name = "python-dotenv" }, { name = "rich" }, @@ -569,7 +673,7 @@ client = [ { name = "httpx" }, { name = "mcp" }, { name = "opentelemetry-api" }, - { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"] }, + { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"], marker = "extra == 'extra-12-beaver-agent-local' or extra == 'extra-12-beaver-agent-prod'" }, ] server = [ { name = "authlib" }, @@ -583,7 +687,7 @@ server = [ { name = "openapi-pydantic" }, { name = "opentelemetry-api" }, { name = "packaging" }, - { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"] }, + { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"], marker = "extra == 'extra-12-beaver-agent-local' or extra == 'extra-12-beaver-agent-prod'" }, { name = "pyperclip" }, { name = "python-multipart" }, { name = "pyyaml" }, @@ -1081,7 +1185,7 @@ dependencies = [ { name = "jsonschema" }, { name = "pydantic" }, { name = "pydantic-settings" }, - { name = "pyjwt", extra = ["crypto"] }, + { name = "pyjwt", extra = ["crypto"], marker = "extra == 'extra-12-beaver-agent-local' or extra == 'extra-12-beaver-agent-prod'" }, { name = "python-multipart" }, { name = "pywin32", marker = "sys_platform == 'win32'" }, { name = "sse-starlette" },