diff --git a/AGENTS.md b/AGENTS.md index 672e7f75..39183601 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,17 +8,17 @@ ## 1. Project Identity -| Key | Value | -| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **Root package** | `@bytelyst/root` | -| **Library scope** | `@bytelyst/*` (packages/) | -| **Service scope** | `@lysnrai/*` (services/) | -| **Product consumers** | [LysnrAI](../learning_voice_ai_agent), [MindLyst](../learning_multimodal_memory_agents), [ChronoMind](../learning_ai_clock), [JarvisJr](../learning_ai_jarvis_jr), [NomGap](../learning_ai_fastgap), [PeakPulse](../learning_ai_peakpulse) | -| **Product-agnostic** | Yes — every Cosmos doc includes `productId` | -| **Runtime** | Node.js (ESM), TypeScript 5.7+ | -| **Package manager** | pnpm (workspace) | -| **Test runner** | Vitest | -| **Prototype stack** | Docker Compose with Cosmos emulator, Azurite, Mailpit, Traefik, Loki, and Grafana | +| Key | Value | +| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Root package** | `@bytelyst/root` | +| **Library scope** | `@bytelyst/*` (packages/) | +| **Service scope** | `@lysnrai/*` (services/) | +| **Product consumers** | [LysnrAI](../learning_voice_ai_agent), [MindLyst](../learning_multimodal_memory_agents), [ChronoMind](../learning_ai_clock), [JarvisJr](../learning_ai_jarvis_jr), [NomGap](../learning_ai_fastgap), [PeakPulse](../learning_ai_peakpulse), [FlowMonk](../learning_ai_flowmonk), [NoteLett](../learning_ai_notes), [ActionTrail](../learning_ai_trails), [LocalMemGPT](../learning_ai_local_memory_gpt), [EffoRise](../learning_ai_efforise) | +| **Product-agnostic** | Yes — every Cosmos doc includes `productId` | +| **Runtime** | Node.js (ESM), TypeScript 5.7+ | +| **Package manager** | pnpm (workspace) | +| **Test runner** | Vitest | +| **Prototype stack** | Docker Compose with Cosmos emulator, Azurite, Mailpit, Traefik, Loki, and Grafana | ## 2. Monorepo Layout diff --git a/docker-compose.ecosystem.yml b/docker-compose.ecosystem.yml index 2d5a9ab9..89d1023d 100644 --- a/docker-compose.ecosystem.yml +++ b/docker-compose.ecosystem.yml @@ -21,10 +21,11 @@ # Products: peakpulse 4010, chronomind 4011, jarvisjr 4012, # nomgap 4013, mindlyst 4014, lysnrai 4015, # notelett 4016, flowmonk 4017, actiontrail 4018, -# localmemgpt 4019 +# localmemgpt 4019, efforise 4020 # Product webs: chronomind 3030, jarvisjr 3035, flowmonk 3040, # notelett 3045, mindlyst 3050, nomgap 3055, -# actiontrail 3060, localmemgpt 3070, lysnrai 3002 +# actiontrail 3060, localmemgpt 3070, efforise 3080, +# lysnrai 3002 # Product Dockerfiles require BuildKit secrets for Gitea npm registry access. # GITEA_NPM_HOST defaults to host.docker.internal (Mac local dev). @@ -519,6 +520,29 @@ services: retries: 3 restart: unless-stopped + efforise-backend: + build: + <<: *product-build + context: ../learning_ai_efforise + dockerfile: backend/Dockerfile + ports: + - '4020:4020' + env_file: + - .env.ecosystem + environment: + - PORT=4020 + - HOST=0.0.0.0 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4020/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + # ═════════════════════════════════════════════════════════════════ # PRODUCT WEB APPS (from sibling repos) # ═════════════════════════════════════════════════════════════════ @@ -781,6 +805,23 @@ services: retries: 3 restart: unless-stopped + efforise-web: + build: + <<: *product-build + context: ../learning_ai_efforise + dockerfile: client/Dockerfile + ports: + - '3080:3080' + depends_on: + efforise-backend: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:3080'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + # ═════════════════════════════════════════════════════════════════ # VOLUMES # ═════════════════════════════════════════════════════════════════ diff --git a/products/efforise/product.json b/products/efforise/product.json new file mode 100644 index 00000000..2eea45b6 --- /dev/null +++ b/products/efforise/product.json @@ -0,0 +1,45 @@ +{ + "id": "efforise", + "name": "EffoRise", + "displayName": "EffoRise", + "bundleId": "com.saravana.efforise", + "domain": "efforise.app", + "description": "Identity-based habit tracker — rise with efforts", + "platforms": ["web", "mobile"], + "version": "0.1.0", + "theme": { + "primary": "#6366F1", + "secondary": "#8B5CF6", + "accent": "#F59E0B", + "background": "#09090B", + "surface": "#18181B", + "text": "#FAFAFA", + "error": "#EF4444", + "warning": "#F59E0B", + "success": "#22C55E" + }, + "features": { + "identities": true, + "efforts": true, + "habits": true, + "streaks": true, + "insights": true + }, + "cosmos": { + "containers": [ + { "name": "effo_identities", "partitionKey": "/userId" }, + { "name": "effo_efforts", "partitionKey": "/userId" }, + { "name": "effo_habits", "partitionKey": "/userId" }, + { "name": "effo_streaks", "partitionKey": "/userId" }, + { "name": "effo_insights", "partitionKey": "/userId" } + ] + }, + "flags": [ + { "key": "pro-features", "defaultValue": false }, + { "key": "max-identities-free", "defaultValue": 3 } + ], + "ports": { + "service": 4020, + "dashboard": 3080 + } +}