nexxo
2b08b072fe
fix(docker): stop injecting .env as real env vars (test isolation)
...
env_file: .env exported the dev DB/cache config as real container env vars,
which overrode phpunit's forced test env — so the Pest suite ran RefreshDatabase
against the dev MariaDB and wiped it on every run. Laravel already reads .env
from the bind mount; only vite needs VITE_HMR_HOST/VITE_PORT at process level,
now injected explicitly. Tests now use sqlite :memory: and never touch dev data.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 01:28:51 +02:00
nexxo
254a7d46a0
feat(portal): Fortify auth + Login/2FA/Dashboard + component kit
...
Backend (Fortify):
- laravel/fortify with TOTP two-factor + recovery codes; User uses
TwoFactorAuthenticatable; 2FA credentials hidden from serialization.
- Views off — pages are full-page class-based Livewire components (R1/R2);
Fortify handles POST actions. Home redirect -> /dashboard. v1 scope: login +
2FA only (no public register/reset/passkeys). Seeder gated to local/testing.
Component kit (Blade, token-based, a11y):
- button, input, checkbox, alert, card, badge, stat-tile, otp-input (Alpine,
auto-advance/paste, -safe submit), progress-stepper, nav-item, icon
(Lucide), plus layouts/portal-app app-shell (sidebar drawer + topbar + menu).
Screens (localized DE/EN, R16):
- Login (form -> login.store), Two-factor challenge (OTP + recovery fallback),
Dashboard (KPI stat tiles, instance card, provisioning stepper fixtures,
activity). Routes English (R13).
Tests + verification:
- Pest: 14 green (login ok/invalid/throttle, dashboard guard, component render).
- R12 browser (Puppeteer, prod assets): /, /login, /two-factor-challenge and
the authenticated /dashboard all HTTP 200 with ZERO console errors; login
flow verified end-to-end.
- Test isolation fixed (force test env over injected .env).
- Reviewed with Codex (R15): 4 rounds, all findings fixed, final pass clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 01:20:25 +02:00
nexxo
53c2a12d6d
feat(portal): design foundation — Tailwind v3, tokens, self-hosted fonts
...
- Downgrade Tailwind v4 -> v3 (user decision): postcss.config.js,
tailwind.config.js mapping framework-neutral CSS-var tokens onto utilities.
- portal-tokens.css: light enterprise palette, single orange accent, IBM Plex
type scale, radius/shadow/motion/focus (design handoff §6). AA-safe accent
text/fill tokens (accent-active/-press/-text) — #f97316 alone fails AA.
- Self-hosted IBM Plex Sans+Mono via @fontsource, Vite-bundled (R14, no CDN).
- app.css: v3 layers, base type, uniform :focus-visible, reduced-motion.
- layouts/portal.blade.php base layout; welcome page retokenised (guarded
login CTA, DE/EN via lang/common) — no v4-only classes.
- Reviewed with Codex (R15): 5 rounds, all findings fixed, final pass clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 00:43:01 +02:00
nexxo
2ae7595aff
chore: bootstrap CluPilot control-plane (Laravel 13, Docker stack)
...
- Docker dev stack: app (php-fpm+nginx+vite via supervisor), reverb, queue,
scheduler, mariadb 11.4, redis 7 — env-driven ports/UID (HOST_UID=1000).
- Laravel 13.8 + Livewire 3.8 (pinned v3 per R2), Tailwind v4, Reverb, Echo,
phpseclib, wire-elements/modal.
- .env wired to service names; DE default locale (R16); browser Reverb host
env-driven; self-hosted-fonts-ready vite.config (R14).
- Entrypoint bootstraps vendor/node_modules on fresh checkout; bin/clupilot
helper (UID/port env-driven) + shell aliases.
- Reviewed with Codex (R15): 7 findings fixed, 1 verified false-positive.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 00:21:30 +02:00