Each AI agent now has an expressive Companion face (AgentFace) whose animation maps to its real AgentRun state — idle, thinking (queued), working (running), review (held), done, failed — so a glance at the board or org chart reads as live status, the same way the seat-state triad reads human/open/AI. Pure CSS keyframes (no animation dependency), em-scaled across four sizes, per-agent hue derived deterministically in the indigo band, reduced-motion respected. Adds a per-team agent-activity read endpoint (latest run status per agent) and a self-contained polling hook (useAgentActivity) that merges run activity with governance holds. Wired into the board assignee chips and the org chart (a custom React Flow seat node with hidden handles so edges still connect). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
TeamUp.AI
Build human + AI teams. A live org chart that does work: model the org, fill open role-seats with governed AI agents, run delivery on one board. A product of AliaSaaS.
Status: pre-M1 skeleton — the repo builds, tests green, and runs, but carries no feature
code yet. See docs/V1_BUILD_PLAN.md for what M1–M6 add.
Stack
.NET 10 modular monolith (web + worker on one image) · PostgreSQL 17 + pgvector · EF Core 10 ·
React 19 + Vite SPA into wwwroot · Docker Compose for local dev. Full bill of materials in
docs/V1_BUILD_PLAN.md.
Layout
src/Shared/TeamUp.SharedKernel IModule seam, base Entity, IModuleDbContext
src/Shared/TeamUp.Infrastructure PlatformDbContext (pgvector + schemas), MigrationRunner, wiring
src/Bootstrap/TeamUp.Bootstrap the explicit module catalog (the only thing that knows all modules)
src/Modules/TeamUp.Modules.* OrgBoard · Identity · Skills · Assembler · Governance · Memory · Integrations
src/Hosts/TeamUp.Web ASP.NET Core API host (also serves the SPA)
src/Hosts/TeamUp.Worker Generic Host worker (background jobs; M4+)
client/ React/Vite SPA → builds into TeamUp.Web/wwwroot
tests/ ArchitectureTests (boundary rules) · IntegrationTests (Testcontainers)
docker/ Dockerfile (one image, two roles) · docker-compose.yml
Boundary rule: each module is its own assembly; everything but its IModule and public
contracts is internal, so no module can touch another's persistence. TeamUp.ArchitectureTests
backstops this — it fails the build if a module references another module / Infrastructure / a host.
Prerequisites
.NET SDK 10 · Node 22 · Docker. Packages and container images are pulled through a Nexus mirror — see Package & image sources below.
Quick start
# Backend: build, run the boundary + integration tests (integration needs Docker)
dotnet build TeamUp.slnx
dotnet test TeamUp.slnx
# Local dev — two terminals, with the Vite dev server proxying /api to the .NET host
docker compose -f docker/docker-compose.yml up postgres -d # Postgres 17 + pgvector
dotnet run --project src/Hosts/TeamUp.Web # http://localhost:5180 (applies migrations in Dev)
cd client && npm install && npm run dev # http://localhost:5173 (proxies /api, /health)
# Or run the whole thing in containers (web + worker + postgres, single image, RUN_MODE picks the role)
docker compose -f docker/docker-compose.yml up --build
GET /health is the DB health check; GET /api/<module>/ping proves each module seam; the OpenAPI
document is at /openapi/v1.json (Development only).
EF Core migrations
dotnet ef migrations add <Name> \
--project src/Shared/TeamUp.Infrastructure --startup-project src/Shared/TeamUp.Infrastructure \
--context PlatformDbContext --output-dir Persistence/Migrations
The initial InitialPlatform migration enables the vector extension and creates one schema per
module. Module-owned contexts (M1+) get their own migrations and apply after Platform via
MigrationRunner.
Package & image sources
NuGet packages (nuget.config) and container base images (docker/Dockerfile,
docker/docker-compose.yml) are pulled through the self-hosted Nexus mirror
mirror.soroushasadi.com, which proxies nuget.org / Docker Hub / MCR and is reachable from Iran.
To build against the public registries instead, point nuget.config at api.nuget.org and replace
the mirror.soroushasadi.com/... image prefixes with docker.io/library (node) and
mcr.microsoft.com (dotnet). Testcontainers picks up the mirror via
TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX=mirror.soroushasadi.com/.
More
CLAUDE.md— always-loaded project indexdocs/CLAUDE.md— full architecture & domain modeldocs/PRODUCT.md— complete product modeldocs/V1_BUILD_PLAN.md— the V1 wedge (M1–M6) + bill of materials