Daniel SamsonandClaude Opus 4.6 869d82998b Fresh clone on every automated task, generic repo setup
Always rm -rf ~/project before cloning to avoid stale state from
previous workspace runs on the same PVC. Made setup steps generic
(detect frontend, playwright, migrations) instead of babble-specific.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-12 14:25:17 +01:00

SDLC Orchestrator

Lightweight webhook-driven orchestrator that replaces n8n for the Gitea + Coder + Claude Code SDLC pipeline.

Receives Gitea webhooks, routes them to the correct SDLC stage, creates Coder workspaces, and posts status comments back on issues/PRs.

Architecture

Gitea Webhooks → SDLC Orchestrator → Coder API (creates workspace)
                                   → Gitea API (posts comments)

~500 lines of TypeScript. No database, no UI, no state — just a webhook router.

Webhook Endpoints

Endpoint Gitea Event Action
POST /webhook/gitea-issue-triage Issue opened Route to analyse or fix-bug
POST /webhook/gitea-issue-label Issue labeled Stage transition (architect/develop/test/devops)
POST /webhook/gitea-issue-comment Comment created Re-trigger analyst if still in analysis
POST /webhook/gitea-pr-review PR opened/synced Trigger code review
POST /webhook/gitea-pr-review-rework Review submitted Route to rework-pr or test
POST /webhook/gitea-release Release issue Tag RC or production release
GET /health — Health check

Plus a cron job (Monday 9 AM) for weekly maintenance.

Setup

Prerequisites

  • Node.js 22+
  • Coder running with the cloudflare-worker template (see coder/)
  • Gitea with two bot accounts: claude-dev and claude-review

Environment Variables

Variable Required Description
PORT No HTTP port (default: 3000)
CODER_URL Yes Coder API base URL
CODER_TOKEN Yes Coder session token
CODER_TEMPLATE_ID Yes Coder workspace template ID
GITEA_DEV_TOKEN Yes Gitea API token for claude-dev
GITEA_REVIEW_TOKEN Yes Gitea API token for claude-review
ANTHROPIC_API_KEY Yes Anthropic API key for Claude Code
GITEA_URL No Gitea base URL (default: https://gitea.samson.media)
BOT_DEV_USERNAME No Dev bot username (default: claude-dev)
BOT_REVIEW_USERNAME No Review bot username (default: claude-review)
MAINTENANCE_REPOS No Comma-separated org/repo=clone_url for weekly maintenance

Local Development

npm install
cp k8s/secret.yaml.example .env  # Edit with real values (use KEY=value format)
npm run dev

Deploy to k3s

# Build and push image
docker build -t registry.samson.media/sdlc-orchestrator:latest .
docker push registry.samson.media/sdlc-orchestrator:latest

# Create secrets
cp k8s/secret.yaml.example k8s/secret.yaml
# Edit k8s/secret.yaml with real values
kubectl apply -f k8s/secret.yaml

# Deploy
kubectl apply -f k8s/deployment.yaml

Configure Gitea Webhooks

For each project, add these webhooks in Settings → Webhooks:

Event URL
Issues (opened) https://sdlc.samson.media/webhook/gitea-issue-triage
Issues (labeled) https://sdlc.samson.media/webhook/gitea-issue-label
Issue Comments (created) https://sdlc.samson.media/webhook/gitea-issue-comment
Pull Request (opened, synchronized) https://sdlc.samson.media/webhook/gitea-pr-review
Pull Request Review (submitted) https://sdlc.samson.media/webhook/gitea-pr-review-rework
Issues (opened, labeled) — releases https://sdlc.samson.media/webhook/gitea-release

Coder Template

The coder/ directory contains the Terraform template for ephemeral Kubernetes workspaces. See coder/README.md.

Migrating from n8n

  1. Deploy this service to k3s
  2. Update Gitea webhooks to point to sdlc.samson.media instead of n8n.samson.media
  3. Verify with a test issue
  4. Decommission n8n
S
Description
No description provided
Readme
268 KiB
Languages
TypeScript 69.3%
HCL 28.9%
Dockerfile 1.8%