shipnode 3.0.0 — workspace multi-app
Highlights:
- Multi-app workspaces: one shipnode.config.ts can declare N apps
(backend + frontend in a monorepo, etc.), each with its own domain,
PM2 process group, Caddy site block, release directory, env file,
health check, and hooks.
- Multi-hostname Cloudflare tunnel: cloudflare init derives ingress
entries from each app's domain + web port; single tunnel, N hostnames,
idempotent.
- Schema-first config: zod schema is the single source of truth;
TypeScript types derive from it, assembleConfig is a thin transformer.
- Internal layers: domain (pure) / services (orchestrators) /
infrastructure (I/O) / CLI commands (thin adapters, <80 lines).
- CLI gains --app <name> flag on per-app commands; rollback requires it.
Breaking changes (see docs/migrations/2.x-to-3.0.md):
- Per-app fields moved from top-level config to apps[i]
- CloudflareConfig.appHostname removed (derived from app.domain)
- Disk layout per-app: <remotePath>/<app-name>/releases/<ts>/
- rollback requires --app explicitly