SuperSeller3000/README.md
Simon Kuehn f0d9f374e6 docs: add README and update design doc for post-plan features
New README.md covers quick start, tech stack, running tests, AI backend
switching, admin features, and architecture overview.

Design doc updated (2026-05-18): Tavily replaces SerpAPI, specs_text
field, pipeline model cache step, findExistingCustomer in order flow,
required-attribute UX, user permissions UI, article detail-first nav,
updated open items.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 17:41:33 +00:00

133 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SuperSeller3000
Admin middleware for managing and selling refurbished IT hardware. Handles article ingestion via AI pipeline (photo → vision → specs → eBay text), multi-channel publishing (eBay), and order processing with Frappe ERP invoicing.
**Live:** `https://ss3k.schaunwama.de/admin`
**Full design doc:** `docs/superpowers/specs/2026-05-13-superseller3000-design.md`
---
## Quick Start
```bash
cp .env .env.local # fill in secrets (DB, Redis, AI keys, eBay, Frappe)
docker compose up -d
docker compose exec app php bin/console doctrine:migrations:migrate --env=prod
docker compose exec app php bin/console app:users:create --env=prod
```
Workers start automatically via Docker Compose (`worker-ai`, `worker-orders`, `worker-channel`).
---
## Tech Stack
| Layer | Technology |
|---|---|
| Language / Framework | PHP 8.4 · Symfony 8.4 |
| ORM | Doctrine ORM |
| Database | PostgreSQL 17 — schemas: `app`, `logs`, `logs_archive` |
| Queue | Symfony Messenger + Redis Streams |
| AI | Ollama (local, SSH-tunnel) **or** Mistral Cloud API — alias-switchable in `services.yaml` |
| Web Search | Tavily API (`TAVILY_API_KEY`) |
| Admin | EasyAdmin 5 |
| Auth | Symfony Security + TOTP 2FA (scheb/2fa-totp) |
| Proxy | Caddy 2 (Auto-HTTPS) |
---
## Running Tests
```bash
# Unit tests (fast, no external deps)
docker compose exec app php vendor/bin/phpunit tests/Unit/ --testdox
# Integration tests (requires staging credentials in .env.local)
bin/test-integration
# Single integration file
bin/test-integration tests/Integration/path/to/Test.php
# Static analysis + code style
docker compose exec app composer phpstan
docker compose exec app composer cs-check
```
---
## AI Backend
Switch between Ollama and Mistral in `config/services.yaml`:
```yaml
# Ollama (default — local via SSH tunnel)
App\Infrastructure\AI\OllamaClientInterface:
alias: App\Infrastructure\AI\OllamaClient
# Mistral Cloud
App\Infrastructure\AI\OllamaClientInterface:
alias: App\Infrastructure\AI\MistralClient
```
Set models via env vars: `AI_TEXT_MODEL`, `AI_VISION_MODEL`. After switching: `docker compose exec app php bin/console cache:clear`.
---
## Admin Panel Features
- **Articles** — list (click row → detail view, Edit as action), ingest form with stock quantity, attribute validation with required-field highlighting
- **AI Pipeline** — per-job progress view with step tracking; failed jobs show the real error; re-run AI from article detail
- **Article Types** — configurable attribute schemas (name, type, unit, options, required flag); attributes drive specs-research field list
- **Users** — permission checkboxes per user (`ARTICLES_MANAGE`, `PIPELINE_RUN`, `ORDERS_MANAGE`, etc.)
- **Orders / Customers / Invoices** — full read/manage view
- **Prompt Templates** — editable via admin (DB-backed, `{{variable}}` substitution)
---
## Manual Article Ingest
Admin → **New Article** (or via API):
```bash
curl -X POST https://ss3k.schaunwama.de/api/pipeline/photo-upload \
-H "X-Api-Key: <key>" \
-F "articleTypeId=<uuid>" \
-F "condition=good" \
-F "stock=1" \
-F "photo=@/path/to/photo.jpg"
```
Pipeline: Photo → OllamaVision (model number) → **DB model cache check***(cache hit: copy + done)* / *(cache miss: Tavily search → JsonCoding → Validation → Draft → eBay text)*
---
## API Keys
Generated via console only (raw key shown once):
```bash
docker compose exec app php bin/console app:api-keys:create --env=prod
```
Use as `X-Api-Key: <rawKey>` header.
---
## Architecture
Hexagonal (Domain / Application / Infrastructure). See design doc for full details.
```
src/
Domain/ # Pure PHP — Article, ArticleType, Order, Customer, AIPipelineJob …
Application/ # Use cases, orchestration via interfaces
Infrastructure/
AI/ # OllamaClient, MistralClient, 4 AI agents
Channel/ # EbayAdapter, FrappeErpAdapter
Search/ # TavilyWebSearch
Persistence/ # Doctrine repositories (PostgreSQL)
Messenger/ # Message classes + handlers (3 queues: ai_pipeline, orders, channel_sync)
Http/ # Symfony controllers, EasyAdmin CRUD, webhooks
```
All plans (16) complete. Active development tracked via Claude Code sessions.