rdev/cookbooks/trees/aeries-1-genesis.yaml
jordan 592b2d5ec0 fix: clarify database types across docs and fix video storage persistence
Two distinct fixes:

1. Database terminology: Make it crystal clear that generated projects use
   CockroachDB in production and PostgreSQL for local dev, while the rdev
   platform itself uses PostgreSQL. Updated 15 files across skeleton agents,
   component templates, cookbook trees, and platform docs.

2. Video storage: VideoHandler was ignoring vid.Data bytes (already downloaded
   by the Gemini adapter with auth) and re-downloading from the provider URL
   with a plain GET — which fails because Gemini URLs require API key auth.
   Now uses vid.Data first, falls back to downloadURL only for public URLs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 23:13:21 -07:00

127 lines
3.8 KiB
YAML

name: aeries-1-genesis
description: "Aeries Phase 1: The Monolith. Creates the Core API and React App for Agent Creation."
version: 1
vars:
project_name: ""
service_name: "core-api"
app_name: "creator-ui"
feature_slug: "agent-crud"
steps:
# --- Infrastructure ---
create-project:
action: api
method: POST
endpoint: /project
body:
name: "{{ .vars.project_name }}"
description: "Aeries Genesis: The God Game"
outputs:
- project_id: .data.name
- domain: .data.domain
add-db:
description: Add CockroachDB
depends_on: [create-project]
action: api
method: POST
endpoint: "/projects/{{ .outputs.create-project.project_id }}/components"
body: { type: postgres, name: "core-db" }
add-core:
description: Add Core Monolith Service
depends_on: [add-db]
action: api
method: POST
endpoint: "/projects/{{ .outputs.create-project.project_id }}/components"
body: { type: service, name: "{{ .vars.service_name }}" }
add-web:
description: Add React Frontend
depends_on: [add-core]
action: api
method: POST
endpoint: "/projects/{{ .outputs.create-project.project_id }}/components"
body: { type: app-react, name: "{{ .vars.app_name }}" }
wait-infra:
action: wait_pipeline
project_id: "{{ .outputs.create-project.project_id }}"
# --- Feature: Agent Creation ---
create-feature:
action: api
method: POST
endpoint: "/projects/{{ .outputs.create-project.project_id }}/sdlc/features"
body:
slug: "{{ .vars.feature_slug }}"
title: "Agent Creation Flow"
spec-feature:
description: "Define Agent Data Model (Name, Bio, Stats)"
depends_on: [create-feature]
action: api
method: POST
endpoint: "/projects/{{ .outputs.create-project.project_id }}/builds"
body:
prompt: "/spec-feature {{ .vars.feature_slug }}"
auto_commit: true
auto_push: true
git_clone_url: "https://git.threesix.ai/jordan/{{ .outputs.create-project.project_id }}.git"
outputs:
- build_id: .data.task_id
wait-spec:
description: Wait for spec generation
depends_on: [spec-feature]
action: wait_build
build_id: "{{ .outputs.spec-feature.build_id }}"
max_attempts: 120
poll_interval: 5
implement-backend:
description: "Implement GET/POST /agents in Core API"
depends_on: [wait-spec]
action: api
method: POST
endpoint: "/projects/{{ .outputs.create-project.project_id }}/builds"
body:
prompt: "/implement-feature {{ .vars.feature_slug }} --scope backend --requirements 'Use pkg/api. DB Table: agents. Fields: id, name, personality_prompt, created_at.'"
auto_commit: true
auto_push: true
git_clone_url: "https://git.threesix.ai/jordan/{{ .outputs.create-project.project_id }}.git"
outputs:
- build_id: .data.task_id
wait-backend:
description: Wait for backend implementation
depends_on: [implement-backend]
action: wait_build
build_id: "{{ .outputs.implement-backend.build_id }}"
max_attempts: 120
poll_interval: 5
wait-deploy:
action: wait_pipeline
project_id: "{{ .outputs.create-project.project_id }}"
# --- Verification ---
verify-api:
description: "Test Agent Creation via API"
depends_on: [wait-deploy]
action: shell
command: |
DOMAIN="{{ .outputs.create-project.domain }}"
echo "Creating Agent..."
ID=$(curl -s -X POST "https://$DOMAIN/api/agents" -d '{"name":"Hal","personality":"Helpful"}' -H "Content-Type: application/json" | jq -r .id)
echo "Verifying..."
RESP=$(curl -s "https://$DOMAIN/api/agents/$ID")
if echo "$RESP" | grep -q "Hal"; then exit 0; else exit 1; fi
teardown:
- action: api
method: DELETE
endpoint: "/project/{{ .outputs.create-project.project_id }}"