메뉴
HN
Hacker News 39일 전

클라우드 기반 원샷 코딩 에이전트 Broccoli 오픈소스 공개

IMP
8/10
핵심 요약

Linear 티켓을 할당하면 Claude와 Codex 기반의 AI가 밤사이 코드를 작성해 PR(Pull Request)까지 생성해 주는 오픈소스 코딩 에이전트 'Broccoli'가 공개되었습니다. 이 도구는 개발자의 구글 클라우드(GCP) 환경에 배포되어 데이터가 외부로 유출되지 않는 보안성을 갖추고 있으며, 약 30분이면 배포를 완료할 수 있는 실무형 솔루션을 제공합니다.

번역된 본문

🥦 Broccoli: 당신의 개발 워크플로우를 위한 오픈소스 AI 팀원

Broccoli는 Linear 티켓을 배포 가능한 PR(Pull Request)로 변환해 줍니다. Claude와 Codex 기반으로 작동하며, 사용자의 자체 구글 클라우드(Google Cloud) 환경에서 실행됩니다.

왜 Broccoli인가?

🎯 Linear 티켓 → 리뷰 가능한 PR. Broccoli 봇에게 이슈를 할당하기만 하면, 여러분이 자는 동안 에이전트가 계획을 세우고 코드를 구현한 뒤 PR을 열어둡니다.

🔒 당신의 인프라, 당신의 키, 당신의 데이터. 자체 GCP 프로젝트와 Postgres 데이터베이스에 배포됩니다. 서드파티 제어 평면(Control Plane)이 없으며, 데이터가 고객의 테넌시(Tenancy)를 벗어나지 않습니다.

🧱 첫날부터 프로덕션급. 서버리스 Cloud Run, Secret Manager, 웹훅 중복 제거(Dedupe), 그리고 내구성 있는 작업 상태(Durable Job State)를 제공하는 장난감이 아닌 실무형 도구입니다.

🧩 프롬프트 직접 제어. 저희가 제공하는 프롬프트 템플릿으로 시작하세요. 코드와 함께 포크(Fork)하고, 튜닝하고, 버전 관리할 수 있습니다.

⚡ 모든 PR에 대한 AI 코드 리뷰. Claude와 Codex가 코드의 변경 사항(Diffs)을 읽고, 실행 가능한(Actionable) 코멘트를 남기며, 요청 시 수정 커밋(Fix Commits)을 푸시합니다.

🛠️ 약 30분 만에 배포. 단 하나의 부트스트랩 스크립트, 하나의 설정 파일, 두 개의 웹훅으로 배포를 완료하세요.

사용 방법 (코딩 에이전트와 함께 사용하기)

선호하는 코딩 에이전트(저희는 Codex CLI를 사용합니다)에 다음 프롬프트를 붙여넣으세요.

"이 리포지토리를 내 구글 클라우드 프로젝트에 배포해 줘. GitHub 리포지토리 URL만 제공한 경우 먼저 리포지토리를 클론(Clone)해. 이미 로컬에 리포지토리를 열어둔 상태라면 기존 체크아웃(Checkout)된 상태에서 작업해. 리포지토리의 배포 지침, 스크립트 및 .agents/skills/broccoli-oss-gcp-deploy/SKILL.md를 사용해. 이 요청은 코드베이스를 검사하는 것이 아니라 앱을 배포하라는 요청으로 간주해. 필수 구성 요소(Prerequisites)가 하나도 준비되지 않았다고 가정해. 본격적인 작업 전에 다음 체크포인트를 하나씩 안내하고, 다음 단계로 넘어가기 전에 내 답변을 확인해. README의 해당 섹션이 이 단계를 다루고 있다면 다시 설명하는 대신 해당 섹션을 가리켜.

  1. GCP 프로젝트 및 결제: 결제가 연결된 구글 클라우드 프로젝트가 이미 있는지, 그리고 해당 계정으로 gcloud에 로그인되어 있는지 물어봐. 그렇지 않은 경우 프로젝트 생성(https://console.cloud.google.com/cloud-resource-manager) 및 결제 연결(https://console.cloud.google.com/billing/projects)을 안내해 주거나, 배포 스킬이 나를 위해 프로젝트를 생성해 줄 수 있다고 제안해 줘. 프로젝트 ID를 기록해 둬.

  2. GitHub 앱: 필요한 권한(Contents, Pull requests, Issues = 읽기/쓰기; Metadata = 읽기 전용; 'Pull request review' 이벤트 구독)으로 Broccoli용 GitHub 앱을 이미 만들었는지 물어봐. 아직이라면 'README.md -> Deploy it on your GCP -> 1. Create a GitHub App' 단계를 하나씩 안내해 줘. 숫자로 된 앱 ID(App ID)를 기록하고 개인 키 PEM 파일을 로컬에 다운로드하도록 해. 임시 Homepage/Webhook URL은 지금 상태로 괜찮으며, 실제 URL은 부트스트랩(Bootstrap) 과정에서 출력될 거야.

  3. Linear 봇 유저 및 API 키: 중요: Linear API 키는 반드시 전용 Linear 봇 유저에 속해야 하며, 내 개인 계정의 키가 아니어야 해. 개인 키를 사용하면 '봇에게 할당된 이슈가 실행을 트리거'하는 흐름이 자동으로 깨집니다. 전용 봇 유저가 이미 있는지 물어봐. 아직이라면 'README.md -> 2. Designate a Linear bot user'를 안내해 줘. Linear 유저를 생성하거나 지정하고, Broccoli를 통해 이슈를 라우팅(Routing)할 모든 팀에 해당 봇을 추가한 뒤, 해당 봇 유저로 로그인(또는 관리자가 해당 유저로 전환)하여 설정 페이지에서 API 키를 생성해. 준비된 키를 확인하기 전에 내 개인 계정이 아닌 봇 유저의 계정에서 나온 것임을 명시적으로 확인해 줘. 봇 유저 ID를 기록해 둬.

  4. OpenAI 및 Anthropic API 키: 각 계정에서 결제가 활성화된 유효한 API 키를 이미 가지고 있는지 물어봐. 없다면 OpenAI 및 Anthropic API 키 페이지로 보내 생성하도록 해.

  5. Linear 웹훅(Webhook): 이 단계는 나중에 진행되며, 부트스트랩이 서비스 URL을 출력한 후에 구성됩니다. 서비스 URL이 생성되면, 자동 생성된 broccoli-oss-linear-webhook-secret을 사용하여 ${Service URL}/webhooks/linear를 가리키는 Linear 웹훅을 추가하고 Issue 및 Issue label 이벤트를 구독해야 한다는 점만 지금 알려줘. 지금 당장 이 단계에서 무언가를 할 필요는 없어.

  6. Secret Manager 값 채우기: 대상 프로젝트가 존재하면, 4개의 운영자 관리 시크릿(broccoli-oss-github-app-private-key-pem, broccoli-oss-linear-api...에 대해 각각 작업을 진행해."

원문 보기
원문 보기 (영어)
🥦 Broccoli OSS AI teammates for your engineering loop. Broccoli turns Linear tickets into shipped PRs — powered by Claude and Codex, running on your own Google Cloud. Why Broccoli 🎯 Linear ticket → reviewable PR. Assign an issue to the Broccoli bot and watch it plan, implement, and open a pull request while you sleep. 🔒 Your infra. Your keys. Your data. Deployed to your GCP project against your Postgres. No third-party control plane, no data leaving your tenancy. 🧱 Production-grade on day one. Serverless Cloud Run + Secret Manager + webhook dedupe + durable job state. No toy. 🧩 Own your prompts. Start with our opinionated prompt templates. Fork, tune, and version them with your code. ⚡ AI code review on every PR. Claude and Codex read your diffs, leave actionable comments, and push fix commits when you ask. 🛠️ Deploys in ~30 minutes. One bootstrap script. One config file. Two webhooks. Ship. Use This With a Coding Agent Paste the following prompt to your favorite coding agent. Ours is codex cli. Deploy this repository to my Google Cloud project. If I only gave you the GitHub repo URL, clone the repo first. If I already opened the repo locally, work from the existing checkout. Use the repo's deployment instructions, scripts, and `.agents/skills/broccoli-oss-gcp-deploy/SKILL.md`. Treat this as a request to deploy the app, not just inspect the codebase. Do not assume I have any of the prerequisites done yet. Before discovery, walk me through these checkpoints one at a time, and for each one confirm my answer before moving on. If a section of the README covers the step, point me to it instead of re-explaining. 1. GCP project + billing. Ask whether I already have a Google Cloud project with billing attached, and whether `gcloud` is logged in to that account. If not, walk me through creating the project at https://console.cloud.google.com/cloud-resource-manager and attaching billing at https://console.cloud.google.com/billing/projects, or offer to have the deployment skill create the project for me. Record the Project ID. 2. GitHub App. Ask whether I have already created a GitHub App for Broccoli with the required permissions (Contents, Pull requests, Issues = read/write; Metadata = read-only; subscribed to the `Pull request review` event). If not, walk me through `README.md -> Deploy it on your GCP -> 1. Create a GitHub App` step by step. Have me record the numeric App ID and download the private key PEM file locally. Placeholder Homepage/Webhook URLs are fine for now; bootstrap will print the real URLs. 3. Linear bot user + API key. IMPORTANT: the Linear API key must belong to a dedicated Linear bot user, NOT my personal account. A personal key silently breaks the "issue assigned to bot triggers a run" flow. Ask whether a dedicated bot user already exists. If not, walk me through `README.md -> 2. Designate a Linear bot user`: create or designate a Linear user, add it to every team whose issues should route through Broccoli, then log in as that bot user (or have an admin switch to that user) and generate the API key from that user's settings page. Before you accept the key as ready, explicitly confirm with me that it came from the bot user and not from my personal account. Record the bot user id. 4. OpenAI + Anthropic API keys. Ask whether I already have active API keys with billing enabled on each account. If not, send me to the OpenAI and Anthropic API keys pages to create them. 5. Linear webhook. This one comes later and is configured after bootstrap prints the service URL. Just tell me now that once the service URL exists, I will add a Linear webhook pointing at `${Service URL}/webhooks/linear` using the auto-generated `broccoli-oss-linear-webhook-secret` and subscribe to Issue and Issue label events. I do not need to do anything for this step yet. 6. Secret Manager population. Once the target project exists, for each of the four operator-managed secrets (`broccoli-oss-github-app-private-key-pem`, `broccoli-oss-linear-api-key`, `broccoli-oss-openai-api-key`, `broccoli-oss-anthropic-api-key`) give me the exact Secret Manager console URL for the target project and pause until I confirm each secret has a `latest` version. You retrieve the auto-generated webhook and DB password secrets yourself after bootstrap; I do not touch those. Workflow after the checkpoints above: - Run a non-mutating discovery step and fail fast on missing `gcloud` auth, billing access, org or project permissions, or other required local tools. - If I do not already have a target GCP project, create or prepare one first. - Before making cloud changes, show me the resolved deployment plan and any missing non-secret inputs. - Never ask me to paste secrets into chat. If required secrets are missing, tell me exactly which secret names I need to populate in the target project and pause until I confirm they are present. - Prefer the repo's existing deploy scripts, documented defaults, and post-deploy checks over guesswork. - Use the Cloud Build path by default instead of local Docker. - After deployment, continue through the verification steps you can safely run, then report the service URL, any remaining manual setup (including the Linear webhook from checkpoint 5), and the smoke-test result. This is the fast path if you want the agent to drive the deployment for you. If you want the manual step-by-step path instead, use the guide below; it starts from project creation and shows exactly where the manual setup happens. Table of contents Architecture at a glance Prerequisites Deploy it on your GCP 0. Create or choose a GCP project 1. Create a GitHub App 2. Designate a Linear bot user 3. Open Secret Manager in the right project 4. Add the required secret values 5. Build and push images with Cloud Build 6. Run bootstrap 7. Install the GitHub App on a repo 8. Run migrations and seed repo config 9. Register the webhooks 10. Run preflight 11. Run the smoke tests Operating Broccoli Inspecting job state Ignored webhook responses Retrying a failed webhook safely IAM Local development Documentation Contributing License FAQ Architecture at a glance Broccoli runs as two Cloud Run workloads over a shared Postgres: Component Role broccoli-oss-service FastAPI service that receives GitHub and Linear webhooks, verifies signatures, dedupes deliveries, and creates job records. broccoli-oss-runner Cloud Run Job that executes automation using the codex and claude CLIs against vendored prompt templates. Postgres Durable state for jobs, webhook deliveries, PR state, Linear issue state, and repo config. Secret Manager Holds the GitHub App private key, webhook secrets, LLM API keys, and database URL. See ARCHITECTURE.md for the full design and JOB-CONTRACT.md for the webhook and state-model contract. Prerequisites A Google Cloud account that can either create a new project and attach billing, or administer an existing project. gcloud authenticated to that Google Cloud account. You do not need to know the final project ID before starting. Browser access to GitHub, Linear, and the GCP Console. Several first-time setup steps are intentionally manual because the required values live in those products and should not be pasted into chat. Docker with buildx only if you intentionally want to build images locally instead of using the default Cloud Build path. Python 3.12+ and uv for operator tooling (migrations, seed, preflight). An Anthropic API key and an OpenAI (or Codex) API key, or the ability to create them. Deploy it on your GCP The sequence below is written for a first-time operator. It starts from zero, explains where values come from, and calls out the steps that must still happen manually for security reasons. 0. Create or choose a GCP project You need a Google Cloud project before you can add Broccoli secrets or deploy Cloud Run services. If you already have a project you want to use: Open the project in the GCP Console. Record the Project ID . You will use this in later steps. Confirm billing is atta