mirror of
https://github.com/0xWheatyz/handler.git
synced 2026-08-30 17:36:24 +00:00
eba0e19ec9
Implements the Phase 1 MVP from the README: a stateless control layer + HTTP API over a centralized database, with hook-enforced test/push gates. - DB layer: SQLAlchemy Core, one schema rendering both Postgres (BIGSERIAL / TIMESTAMPTZ / JSONB) and SQLite (INTEGER PK / TEXT / JSON) via portable types; native ON CONFLICT DO UPDATE checkmark upsert on both dialects. - Alembic dual-dialect migrations (render_as_batch for SQLite); tests run a real `alembic upgrade head`. - FastAPI: projects/agents/checkmark/log/answer/resume + shared log/context routes, single global bearer token, higher-trust token gating shared-context writes, project isolation on every route. - Hooks (`python -m handler.hooks <event>`): Stop test gate (block on red), PreToolUse AskUserQuestion defer + `git push` gate (tests then throwaway build), Notification generic webhook (no-op without WEBHOOK_URL). Identity via env injected at spawn; verify is the mock seam. - Control CLI: spawn/list/attach/kill, hard `.mise.toml [tasks.test]` gate, generated per-agent settings.json, identity + DATABASE_URL injected via tmux; tmux is the mock seam. - 45 tests (SQLite), ruff clean. Live claude/tmux/mise spawning deferred behind the mocked seams. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W5ZuS5pV1NS6eKsRZHXonY
48 lines
1.0 KiB
TOML
48 lines
1.0 KiB
TOML
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[project]
|
|
name = "handler"
|
|
version = "0.1.0"
|
|
description = "Remote control wrapper for Claude Code agents across isolated projects"
|
|
readme = "README.md"
|
|
requires-python = ">=3.11"
|
|
license = { text = "MIT" }
|
|
dependencies = [
|
|
"fastapi>=0.115,<0.116",
|
|
"uvicorn[standard]>=0.34,<0.35",
|
|
"sqlalchemy>=2.0,<2.1",
|
|
"alembic>=1.14,<1.15",
|
|
"psycopg[binary]>=3.2,<3.3",
|
|
"pydantic>=2.10,<3.0",
|
|
"pydantic-settings>=2.7,<3.0",
|
|
"httpx>=0.28,<0.29",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"pytest>=8.3,<9.0",
|
|
"respx>=0.22,<0.23",
|
|
"ruff>=0.9,<0.10",
|
|
]
|
|
|
|
[project.scripts]
|
|
handler = "handler.control.cli:main"
|
|
|
|
[tool.hatch.build.targets.wheel]
|
|
packages = ["src/handler"]
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
pythonpath = ["src"]
|
|
|
|
[tool.ruff]
|
|
src = ["src", "tests"]
|
|
line-length = 100
|
|
|
|
[tool.ruff.lint]
|
|
select = ["E", "F", "I", "W", "UP", "B"]
|
|
# B008: FastAPI's Depends()/Query() in argument defaults is the framework's idiom.
|
|
ignore = ["B008"]
|