# PostgreSQL SQLAlchemy URL. Used by the API, worker, and Alembic. DATABASE_URL=postgresql+psycopg://devbot:devbot@localhost:5432/devbot # Slack bot token for chat.postMessage (xoxb-...). Never log this value. SLACK_BOT_TOKEN=xoxb-your-bot-token # Slack Events API signing secret. Used to HMAC-verify POST /slack/events. SLACK_SIGNING_SECRET=your-slack-signing-secret # GitHub PAT or fine-grained token. Needs Contents + Pull requests + Issues write. # Classic PAT also needs the `project` scope so the bot can create/move the Devbot board. # Fine-grained: Projects read/write. Used to clone/fetch, open PRs, and create/comment on issues. # Never give this to Cursor. GITHUB_TOKEN=ghp_your_token # Optional Project V2 node id (PVT_...). Empty = find or create a user-owned project titled Devbot. GITHUB_PROJECT_ID= # Optional GitHub username assigned when a pipeline phase starts. GITHUB_ASSIGNEE= # Shared secret for POST /github/events HMAC verification (X-Hub-Signature-256). GITHUB_WEBHOOK_SECRET=your-github-webhook-secret # Used when an ALLOWED_REPOS entry is a short name without an owner. DEFAULT_GITHUB_ORG=your-org # Base branch for worktrees and pull requests. DEFAULT_GITHUB_BRANCH=main # Cursor user or service-account API key for headless `agent` CLI. CURSOR_API_KEY=cursor_your_key # Fine-grained PAT (github_pat_...) with Copilot Requests, or a Copilot/GitHub CLI OAuth token. # Classic ghp_ tokens are rejected. Do not reuse GITHUB_TOKEN here. COPILOT_GITHUB_TOKEN= # When both CURSOR_API_KEY and COPILOT_GITHUB_TOKEN are set, pick one: cursor or copilot. CODING_AGENT= # Named GitHub + Cursor or Copilot credentials. Copy users.yaml.example to users.yaml (gitignored). # Slack: @devbot create Erik web Some ticket description # A person sets either cursor_api_key or copilot_github_token. Both keys require agent: cursor|copilot. USERS_FILE=./users.yaml # Optional Cursor CLI binary (default: agent). Use an absolute path on Windows if needed. CURSOR_CLI_BIN=agent # Optional model id passed to `agent --model`. Leave empty for CLI default. CURSOR_MODEL= # Seconds before the Cursor subprocess is terminated (process group kill). CURSOR_TIMEOUT_SECONDS=900 # Optional Copilot CLI binary (default: copilot). COPILOT_CLI_BIN=copilot # Optional model id passed to `copilot --model`. Leave empty for CLI default. COPILOT_MODEL= # Seconds before the Copilot subprocess is terminated (process group kill). COPILOT_TIMEOUT_SECONDS=900 # Root directory for repo caches and per-job worktrees. # Linux/systemd example: /srv/ai-dev AGENT_WORKSPACE=./agent-workspace # Comma-separated allowlist with aliases. Empty = any owner/name the token can access. # owner/repo;alias or owner;alias (becomes owner/alias) # Example: acme/web;web,northwind;shop ALLOWED_REPOS= # Max coding/test loops before the job is marked FAILED. MAX_AGENT_ATTEMPTS=3 # Worker claim lease. If the worker crashes, another worker may reclaim after this many seconds. JOB_LEASE_SECONDS=300 # Detected test-runner timeout. TEST_TIMEOUT_SECONDS=300 # Dashboard login. Both are required. The board, tickets, and job reads stay closed until sign-in. DASHBOARD_USERNAME=devbot DASHBOARD_PASSWORD=change-me # Public dashboard origin, no trailing slash. When a plan is ready, Slack links to # {BASE_URL}/tickets/DEV-N (DEV-N is the internal ticket id). # A host other than localhost / 127.0.0.1 marks the session cookie HTTPS-only. # Example: BASE_URL=https://devbot.example.com BASE_URL=