[build-system] requires = ["hatchling>=1.24"] build-backend = "hatchling.build" [project] name = "squidbrake" dynamic = ["version"] description = "Change control for AI agents. Everyday work runs on its own; anything an agent can't take back waits for a teammate's sign-off, and every action lands on a tamper-evident record. Open source." readme = "README.md" license = "Apache-2.0" license-files = ["LICENSE"] requires-python = ">=3.10" authors = [{ name = "Pulkit Batra" }] keywords = ["ai-agents", "mcp", "claude-code", "guardrails", "human-in-the-loop", "approval", "audit", "security"] classifiers = [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Topic :: Security", "Topic :: Software Development :: Libraries :: Application Frameworks", ] dependencies = [ "fastapi>=0.110", "uvicorn[standard]>=0.29; platform_machine != 'ARM64'", "uvicorn>=0.29; platform_machine == 'ARM64'", # Windows on ARM: httptools has no wheel for it (Python's own parser is used) "sqlalchemy>=2.0", "httpx>=0.27", "pyyaml>=6.0", "python-dotenv>=1.0", "mcp>=2.2,<3", "segno>=1.6", ] [project.optional-dependencies] postgres = ["psycopg[binary]>=3.1"] s3 = ["boto3>=1.28"] ai = ["anthropic>=1.0"] # AI approval briefs (Settings > AI briefs), with your own Anthropic key [project.scripts] squidbrake = "squidbrake.cli:main" [project.urls] Homepage = "https://github.com/batrapulkit/squidbrake" Source = "https://github.com/batrapulkit/squidbrake" Issues = "https://github.com/batrapulkit/squidbrake/issues" Demo = "https://codespaces.new/batrapulkit/squidbrake" [tool.hatch.version] path = "squidbrake/__init__.py" # The gateway is a set of plain scripts in the repo root (python server.py, python connect.py ...). # The wheel puts them inside the squidbrake package so they don't clash with other top-level modules. [tool.hatch.build.targets.wheel] packages = ["squidbrake"] [tool.hatch.build.targets.wheel.force-include] "server.py" = "squidbrake/server.py" "commands.py" = "squidbrake/commands.py" "taint.py" = "squidbrake/taint.py" "risk.py" = "squidbrake/risk.py" "mcp_hub.py" = "squidbrake/mcp_hub.py" "mcp_catalog.py" = "squidbrake/mcp_catalog.py" "outbound.py" = "squidbrake/outbound.py" "mcp_oauth.py" = "squidbrake/mcp_oauth.py" "policy_edit.py" = "squidbrake/policy_edit.py" "siem.py" = "squidbrake/siem.py" "selfguard.py" = "squidbrake/selfguard.py" "weekly.py" = "squidbrake/weekly.py" "integrity.py" = "squidbrake/integrity.py" "onboard.py" = "squidbrake/onboard.py" "pilot.py" = "squidbrake/pilot.py" "telemetry.py" = "squidbrake/telemetry.py" "flow.py" = "squidbrake/flow.py" "verify.py" = "squidbrake/verify.py" "signing.py" = "squidbrake/signing.py" "offline.py" = "squidbrake/offline.py" "proof.py" = "squidbrake/proof.py" "brief.py" = "squidbrake/brief.py" "passkeys.py" = "squidbrake/passkeys.py" "sso.py" = "squidbrake/sso.py" "evidence.py" = "squidbrake/evidence.py" "lockdown.py" = "squidbrake/lockdown.py" "license.py" = "squidbrake/license.py" "effects.py" = "squidbrake/effects.py" "undo.py" = "squidbrake/undo.py" "shell_guard.py" = "squidbrake/shell_guard.py" "runs.py" = "squidbrake/runs.py" "hooklog.py" = "squidbrake/hooklog.py" "connect.py" = "squidbrake/connect.py" "service.py" = "squidbrake/service.py" "claude_hook.py" = "squidbrake/claude_hook.py" "agent_hook.py" = "squidbrake/agent_hook.py" "gw_async.py" = "squidbrake/gw_async.py" "gateway_proxy.py" = "squidbrake/gateway_proxy.py" "gateway_mcp.py" = "squidbrake/gateway_mcp.py" "demo_apps_mcp.py" = "squidbrake/demo_apps_mcp.py" "client.py" = "squidbrake/client.py" "rules.yaml" = "squidbrake/rules.yaml" "rules.shipped" = "squidbrake/rules.shipped" "dashboard.html" = "squidbrake/dashboard.html" "approve.html" = "squidbrake/approve.html" [tool.hatch.build.targets.sdist] only-include = ["squidbrake", "server.py", "commands.py", "risk.py", "mcp_hub.py", "mcp_catalog.py", "outbound.py", "mcp_oauth.py", "policy_edit.py", "siem.py", "selfguard.py", "weekly.py", "integrity.py", "onboard.py", "taint.py", "pilot.py", "telemetry.py", "flow.py", "verify.py", "signing.py", "offline.py", "proof.py", "brief.py", "passkeys.py", "sso.py", "evidence.py", "lockdown.py", "license.py", "effects.py", "undo.py", "shell_guard.py", "runs.py", "hooklog.py", "connect.py", "service.py", "claude_hook.py", "agent_hook.py", "gw_async.py", "gateway_proxy.py", "gateway_mcp.py", "demo_apps_mcp.py", "client.py", "rules.yaml", "rules.shipped", "dashboard.html", "approve.html", "README.md", "LICENSE", "pyproject.toml"]