Each service (blog, market, cart, events, federation, account) now owns its own database schema with independent Alembic migrations. Removes the monolithic shared/alembic/ that ran all migrations against a single DB. - Add per-service alembic.ini, env.py, and 0001_initial.py migrations - Add shared/db/alembic_env.py helper with table-name filtering - Fix cross-DB FK in blog/models/snippet.py (users lives in db_account) - Fix cart_impl.py cross-DB queries: fetch products and market_places via internal data endpoints instead of direct SQL joins - Fix blog ghost_sync to fetch page_configs from cart via data endpoint - Add products-by-ids and page-config-ensure data endpoints - Update all entrypoint.sh to create own DB and run own migrations - Cart now uses db_cart instead of db_market - Add docker-compose.dev.yml, dev.sh for local development - CI deploys both rose-ash swarm stack and rose-ash-dev compose stack - Fix Quart namespace package crash (root_path in factory.py) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
75 lines
2.8 KiB
Markdown
75 lines
2.8 KiB
Markdown
# Art DAG Monorepo
|
|
|
|
Federated content-addressed DAG execution engine for distributed media processing with ActivityPub ownership and provenance tracking.
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
core/ # DAG engine (artdag package) - nodes, effects, analysis, planning
|
|
l1/ # L1 Celery rendering server (FastAPI + Celery + Redis + PostgreSQL)
|
|
l2/ # L2 ActivityPub registry (FastAPI + PostgreSQL)
|
|
common/ # Shared templates, middleware, models (artdag_common package)
|
|
client/ # CLI client
|
|
test/ # Integration & e2e tests
|
|
```
|
|
|
|
## Tech Stack
|
|
|
|
Python 3.11+, FastAPI, Celery, Redis, PostgreSQL (asyncpg for L1), SQLAlchemy, Pydantic, JAX (CPU/GPU), IPFS/Kubo, Docker Swarm, HTMX + Jinja2 for web UI.
|
|
|
|
## Key Commands
|
|
|
|
### Testing
|
|
```bash
|
|
cd l1 && pytest tests/ # L1 unit tests
|
|
cd core && pytest tests/ # Core unit tests
|
|
cd test && python run.py # Full integration pipeline
|
|
```
|
|
- pytest uses `asyncio_mode = "auto"` for async tests
|
|
- Test files: `test_*.py`, fixtures in `conftest.py`
|
|
|
|
### Linting & Type Checking (L1)
|
|
```bash
|
|
cd l1 && ruff check . # Lint (E, F, I, UP rules)
|
|
cd l1 && mypy app/types.py app/routers/recipes.py tests/
|
|
```
|
|
- Line length: 100 chars (E501 ignored)
|
|
- Mypy: strict on `app/types.py`, `app/routers/recipes.py`, `tests/`; gradual elsewhere
|
|
- Mypy ignores imports for: celery, redis, artdag, artdag_common, ipfs_client
|
|
|
|
### Docker
|
|
```bash
|
|
docker build -f l1/Dockerfile -t celery-l1-server:latest .
|
|
docker build -f l1/Dockerfile.gpu -t celery-l1-gpu:latest .
|
|
docker build -f l2/Dockerfile -t l2-server:latest .
|
|
./deploy.sh # Build, push, deploy stacks
|
|
```
|
|
|
|
## Architecture Patterns
|
|
|
|
- **3-Phase Execution**: Analyze -> Plan -> Execute (tasks in `l1/tasks/`)
|
|
- **Content-Addressed**: All data identified by SHA3-256 hashes or IPFS CIDs
|
|
- **Services Pattern**: Business logic in `app/services/`, API endpoints in `app/routers/`
|
|
- **Types Module**: Pydantic models and TypedDicts in `app/types.py`
|
|
- **Celery Tasks**: In `l1/tasks/`, decorated with `@app.task`
|
|
- **S-Expression Effects**: Composable effect language in `l1/sexp_effects/`
|
|
- **Storage**: Local filesystem, S3, or IPFS backends (`storage_providers.py`)
|
|
|
|
## Auth
|
|
|
|
- L1 <-> L2: scoped JWT tokens (no shared secrets)
|
|
- L2: password + OAuth SSO, token revocation in Redis (30-day expiry)
|
|
- Federation: ActivityPub RSA signatures (`core/artdag/activitypub/`)
|
|
|
|
## Key Config Files
|
|
|
|
- `l1/pyproject.toml` - mypy, pytest, ruff config for L1
|
|
- `l1/celery_app.py` - Celery initialization
|
|
- `l1/database.py` / `l2/db.py` - SQLAlchemy models
|
|
- `l1/docker-compose.yml` / `l2/docker-compose.yml` - Swarm stacks
|
|
|
|
## Tools
|
|
|
|
- Use Context7 MCP for up-to-date library documentation
|
|
- Playwright MCP is available for browser automation/testing
|