diff --git a/.planning/phases/01-foundation/01-CONTEXT.md b/.planning/phases/01-foundation/01-CONTEXT.md new file mode 100644 index 0000000..72534fa --- /dev/null +++ b/.planning/phases/01-foundation/01-CONTEXT.md @@ -0,0 +1,120 @@ +# Phase 1: Foundation - Context + +**Gathered:** 2026-02-04 +**Status:** Ready for planning + + +## Phase Boundary + +Validate the Scala/ZIO stack end-to-end with working database and deployment infrastructure. This includes Mill build setup, ZIO HTTP server, PostgreSQL integration via Quill, database migrations, repository pattern, and Pulumi deployment configuration. + + + + +## Implementation Decisions + +### Database Conventions + +**Migrations:** +- Timestamped migration files (20260204_create_users.scala) +- Migrations require both up() and down() methods (rollbacks mandatory) +- Migration history tracked in `summer_migrations` database table +- Migrations run manually via CLI command, not automatically on startup +- Plugin uninstall prompts user whether to keep or drop data + +**Naming:** +- snake_case for all table and column names (PostgreSQL convention) +- Core tables prefixed with `summer_` (summer_users, summer_pages) +- Plugin tables prefixed with `vendor_plugin_` (golem15_queststream_quests) +- Single shared schema (no separate PostgreSQL schemas per plugin) + +**Standard Columns:** +- Scaffolded models include id, created_at, updated_at by default (Winter/October convention) +- These can be removed if not needed +- Soft deletes opt-in per model (add SoftDelete trait when needed) + +### Repository Design + +- Trait + Live implementation pattern (trait UserRepository, class UserRepositoryLive) +- Typed error ADT (sealed trait with NotFound, Conflict, ValidationError, etc.) + +### Build & Run Experience + +**Commands:** +- `mill run` - Simple start +- `mill dev` - Watch mode with file watching and auto-reload +- `summer init` - Interactive project initialization +- `summer check` - Production config validation (DB connection, env vars) +- Full DB command suite: migrate, rollback, reset, seed, status, create-migration +- Scala seed classes for populating test data + +**Server:** +- Default port 8080 +- Hot-reload of Scala code in development +- Global `--debug` flag for verbose output across all commands + +**Logging:** +- Colorized console output in development +- SQL query logging hidden by default, enabled via flag + +**CLI Style:** +- Friendly output with progress indicators, success/error messages +- ASCII art SummerCMS banner with sun + +**Configuration:** +- HOCON files (application.conf) with environment overrides +- Environment variables override HOCON values (Typesafe Config pattern) +- PostgreSQL only (no SQLite option) + +**Build Artifacts:** +- Fat JAR by default +- GraalVM native image as optional build target + +### Deployment Setup + +**Cloud Providers:** +- Multi-provider abstraction (AWS, GCP, Hetzner) +- Dockerfile included in project (users build their own images) + +**Secrets:** +- Pulumi encrypted secrets for DB passwords, API keys + +**Database Provisioning:** +- Configurable: can provision new PostgreSQL or connect to existing + +**SSL/TLS:** +- Let's Encrypt automatic certificate provisioning + +**CDN:** +- Optional add-on (basic deployment works without) + +### Claude's Discretion + +- Foreign key constraint enforcement strategy +- ZIO effect return type patterns for repositories +- Transaction handling approach (explicit wrapper vs service layer) +- Health check endpoint design (/health vs /health + /ready) +- Pulumi stack organization (per-environment vs single stack) +- Deployment documentation depth for Phase 1 + + + + +## Specific Ideas + +- Migration pattern should match Winter/October: scaffold includes id + timestamps by default, removable if not needed +- CLI should have ASCII art sun banner for SummerCMS identity + + + + +## Deferred Ideas + +None — discussion stayed within phase scope + + + +--- + +*Phase: 01-foundation* +*Context gathered: 2026-02-04*