Commit graph

2207 commits

Author SHA1 Message Date
Till JS
8e1601076f fix(presi-web): export auth alias from auth store for existing imports
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 18:32:03 +02:00
Till JS
5871283d60 docs: add Mana Bundle Format plan
Cross-app data bundle format (.mana / .manapkg) for onboarding flows,
templates, and sequential content release. Implementation deferred.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 18:31:45 +02:00
Till JS
f79ad1773a refactor(todo): simplify to single Fokus view, remove Übersicht/Matrix tabs
- Remove Fokus/Übersicht/Matrix view tab group from PillNavigation
- Remove /kanban redirect and activeLayoutMode switching logic
- Hardcode layoutOverride to 'fokus' in +page.svelte
- Fix currentPath reference error after redirect block removal

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 18:29:24 +02:00
Till JS
fa8b2cdf0e feat(infra): migrate chat-web, clock-web, presi-web, nutriphi-web from GHCR to local builds
All 4 apps now use the same local build pattern as the other 33 apps.
Only umami (external project) keeps its GHCR image.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 18:28:31 +02:00
Till JS
58e03e7e26 docs: warn about dual cloudflared config (repo vs server file)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 18:22:59 +02:00
Till JS
5b11f4bd11 fix(uload-web): add health endpoint for Docker healthcheck
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 18:20:42 +02:00
Till JS
86c2abb00d fix(landings-nginx): mkdir snippets before copy, add status.mana.how vhost
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 18:17:22 +02:00
Till JS
cc242d9e00 fix(inventar-web): use browser error tracking import in hooks.client.ts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 18:15:12 +02:00
Till JS
6801ba9fe8 fix(status-page): increase mem_limit to 64m for apk add
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 18:12:46 +02:00
Till JS
0500fb7a0a fix(prerender): suppress favicon.png 404 during prerender in skilltree and nutriphi
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 18:11:53 +02:00
Till JS
f4713ec831 fix(status-page): use host network so container reaches VictoriaMetrics on localhost:9090
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 18:11:30 +02:00
Till JS
bdf76cb24d fix(mana-auth): remove debug log, finalize EMAIL_NOT_VERIFIED detection
APIError.status is string 'FORBIDDEN', body.code is 'EMAIL_NOT_VERIFIED'.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 18:07:57 +02:00
Till JS
d044afec2f feat(status-page): add public status page at status.mana.how
- scripts/generate-status-page.sh: Shell-Script das VictoriaMetrics abfragt
  und eine statische HTML-Statusseite generiert (probe_success + response times)
- docker-compose.macmini.yml: mana-status-gen Container (Alpine, jq, curl)
  schreibt alle 60s nach /Volumes/ManaData/landings/status/
- docker/nginx/landings.conf: status.mana.how vHost mit Cache-Control: no-store
- cloudflared-config.yml: status.mana.how → localhost:4400

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 18:07:07 +02:00
Till JS
504f77a60c debug: log login error shape 2026-03-31 18:05:41 +02:00
Till JS
36922cc946 fix(mana-auth): robust email-not-verified detection
Better Auth throws APIError.from(FORBIDDEN, EMAIL_NOT_VERIFIED).
Check status 403, body.code, and lowercased message.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 18:01:24 +02:00
Till JS
38135ca8b9 fix(uload-web): add missing @tailwindcss/typography dependency
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:59:59 +02:00
Till JS
b1af506b99 fix(auth): surface email-not-verified error and detect needsVerification on signup
- mana-auth login route: catch Better Auth's email verification error and
  return 403 EMAIL_NOT_VERIFIED instead of 401 Invalid credentials
- shared-auth signUp: detect emailVerified:false in register response and
  return needsVerification:true so the UI shows the verification prompt
- shared-auth-ui LoginPage: map INVALID_CREDENTIALS error code to friendly message
- shared-i18n: add invalidCredentials translation (de/en)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:52:47 +02:00
Till JS
999c54a5a1 fix(todo): scrollable sheet body + subtasks animate complete with parent
FokusLayout:
- Wrap DnD zone, footer, and completed-today in .sheet-body
- .sheet-body is the scroll container (flex:1, overflow-y:auto)
- .sheet-content no longer manages scroll — allows scrolling to
  the "Heute erledigt" section below the main task list

KanbanTaskCard:
- Inline subtasks all appear as done (checked + strikethrough) during
  the parent's completing animation via isAnimatingComplete flag
- Subtask clicks blocked during animation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:50:22 +02:00
Till JS
23aa5e26ab fix(uload-web): add missing @tailwindcss/forms dependency
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:48:43 +02:00
Till JS
31d661cc61 docs(mac-mini): document uptime monitoring tools and Grafana dashboard
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:46:10 +02:00
Till JS
a22f1de6d0 feat(todo): complete animation + "Heute erledigt" section on focus pages
KanbanTaskCard:
- Checkbox click animates first (checkPop 300ms, fade to 50% opacity)
- After 500ms the actual onToggleComplete fires and task moves
- Modal cannot open during animation (pointer-events: none)

FokusLayout:
- Derives completedToday from tasks context (isCompleted + completedAt today)
- Shows "Heute erledigt" section at bottom of every sheet
- New items slide in from above (slideDown 350ms animation)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:45:22 +02:00
Till JS
402baf7c7f feat(monitoring): add uptime monitoring via Blackbox Exporter
- scripts/check-status.sh: parallel HTTP check aller mana.how Domains aus cloudflared-config.yml
- docker/blackbox/blackbox.yml: Blackbox Exporter Config (http_2xx, http_health Module)
- docker-compose.macmini.yml: blackbox-exporter Container (Port 9115, 32MB RAM)
- docker/prometheus/prometheus.yml: 4 Scrape-Jobs (blackbox-web, blackbox-api, blackbox-infra, blackbox-gpu)
- docker/prometheus/alerts.yml: 5 Alert-Regeln (WebAppDown, APIDown, InfraToolDown, GPUServiceDown, SlowHTTPResponse)
- docker/grafana/dashboards/uptime.json: Grafana Uptime-Dashboard mit Status-Tables und Verlauf
- package.json: check:status Script

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:43:25 +02:00
Till JS
bce533ca8b fix(uload-web): add missing svelte-i18n dependency
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:38:12 +02:00
Till JS
420bf07520 design(todo): wrap task and subtask titles instead of truncating
- Remove white-space: nowrap / overflow: hidden / text-overflow: ellipsis
- Titles wrap to multiple lines so all content is always readable
- align-items: flex-start on card and subtask rows so checkbox
  and priority dot stay aligned to the first text line (margin-top: 0.2rem)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:36:31 +02:00
Till JS
adfcc7dcee design(todo): paper-style task cards — no border/bg, text-proportional checkboxes
- Remove card border, background, shadow, backdrop-filter, border-radius
- Tasks render as plain text directly on the page background
- Priority dot: slim 3px left accent instead of round dot
- Main checkbox: 1.1rem circle matching title font size
- Title: 0.9375rem regular weight, uses CSS var for theme color
- Subtasks: same size as title (0.9375rem), same checkbox size
- Subtask indent calculated from priority-dot + gaps + checkbox width
- Vertical connecting line aligned to checkbox center

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:34:21 +02:00
Till JS
2a00310273 fix(todo): use \$state.snapshot() for subtask toggle to avoid DataCloneError
Svelte 5 \$state creates deep reactive Proxy objects. IndexedDB can't
serialize Proxies via structured clone algorithm. Using \$state.snapshot()
produces plain objects that IndexedDB can store.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:31:35 +02:00
Till JS
cbe877c3c9 fix(todo): prevent DnD from blocking subtask clicks in KanbanTaskCard
svelte-dnd-action intercepted pointerdown on .task-card-wrapper items,
which interfered with clicks on the inline subtask buttons. Stopping
pointer event propagation on the subtasks container prevents DnD from
treating subtask clicks as drag interactions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:30:01 +02:00
Till JS
03989976f2 fix(compose): change calc-web port from 5026 to 5031 (port conflict with zitare-web)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:30:00 +02:00
Till JS
6496d90097 feat(todo): add inline subtasks to KanbanTaskCard (Fokus layout)
Subtasks now show directly below each task card on the homepage,
indented with a vertical connecting line, directly checkable.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:30:00 +02:00
Till JS
111a7e8cde fix(contacts): use elevated surface background for contact detail modal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:30:00 +02:00
Till JS
b37df6facf feat(todo): redesign task detail modal + add inline subtasks
- Redesign TaskEditModal as a multi-column page-like layout:
  - Title (large, borderless textarea with autoGrow)
  - Content grid: description (left) | subtasks + links (right)
  - Props strip: all metadata as horizontal flex-wrap cells (status,
    priority, due date, recurrence, tags, assignee, story points, etc.)
  - No sidebar, no scrollable property list
- Remove redundant `notes` field from TaskMetadata (keep only `description`)
- Remove all legacy migration code from useTaskForm composable
- Add inline subtasks display to TaskItem on the homepage:
  - Shown indented under parent task when task has subtasks and is incomplete
  - Each subtask is directly checkable (toggleSubtask via onSave callback)
  - Vertical connecting line via CSS pseudo-element

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:30:00 +02:00
Till JS
d8a2b37126 chore(memoro): import legacy backend, mobile, and landing apps
Adds the original NestJS backends (backend, audio-backend), Expo mobile app,
and Astro landing page as-is from the standalone memoro repo. These are
not yet migrated to monorepo standards (migration tracked in memory/CLAUDE.md).

Also adds eslint.config.mjs ignore for apps/*/apps/audio-backend/**
and .prettierignore entries for legacy memoro dirs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:30:00 +02:00
Till JS
09d5576f2a feat(memoro): integrate memoro web app into monorepo (phases 1-6)
Structure: apps/memoro/apps/web, package name @memoro/web
Web tooling: adapter-node, Tailwind v4 + @manacore/shared-tailwind, Vite v6, shared PWA/vite-config
Auth: createManaAuthStore() from @manacore/shared-auth-stores, removed Google/Apple OAuth
Local-first: memoroStore with 7 collections + guest seed data (memos, tags, spaces, etc.)
Service layer: memoService + tagService migrated from Supabase direct to local-store collections
Workspace: dev:memoro:* scripts in root package.json, memoro added to CLAUDE.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:19:20 +02:00
Till JS
019ad557d4 fix(shared-pwa): remove favicon.png from default include assets
No ManaCore app provides favicon.png (all use favicon.svg). The default
caused prerender 404 errors for any app with an /offline page.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:19:04 +02:00
Till JS
1b0c46e7a2 fix(inventar-web): suppress prerender 404 for missing favicon.png
App only provides favicon.svg; the PWA plugin's default includeAssets
list also includes favicon.png which triggers a prerender error.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:04:49 +02:00
Till JS
6e75718cfa feat(arcade): migrate backend from NestJS to Hono/Bun
Replace @arcade/backend (NestJS) with @arcade/server (Hono/Bun).
Same two endpoints, no auth required (public game generator):
- POST /api/games/generate — AI game generation (Gemini, Claude, GPT)
- POST /api/games/submit  — Community game submission via GitHub PR
- GET  /health            — Health check

This removes the last remaining NestJS backend from the monorepo.
NestJS is now completely gone — all servers use Hono + Bun.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:02:14 +02:00
Till JS
7bc4db7e63 fix(builds): repair inventar settings import and add skilltree storage service
- inventar-web: fix mangled icon import in settings page
- skilltree-web: create missing lib/services/storage.ts for export/import
- startup.sh: add umami/synapse DB creation + synapse user setup with C locale

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 16:56:37 +02:00
Till JS
e5ca208cd8 feat(contacts): add context menu to alphabet/grid views with icons, add icons to todo context menu
- Add right-click context menu to ContactAlphabetView (was missing entirely)
- Add icons to ContactGridView context menu items
- Wire up onDeleteContact through ContactList to both views
- Add icons to TaskList (todo) context menu: edit, complete, priority, delete

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 16:55:29 +02:00
Till JS
ab387b9b3d chore: remove all NestJS backend references, replace with Hono/Bun
- Delete nestjs-backend.md guideline (replaced by hono-server.md)
- Delete Dockerfile.nestjs-base and Dockerfile.nestjs templates
- Delete stale BACKEND_ARCHITECTURE.md doc (NestJS-era, obsolete)
- Update CLAUDE.md, GUIDELINES.md, authentication.md to Hono/Bun first
- Update all app CLAUDE.md files: backend/ → server/, NestJS → Hono+Bun
- Update all app package.json files: @*/backend → @*/server
- Update docs: LOCAL_DEVELOPMENT, PORT_SCHEMA, ENVIRONMENT_VARIABLES,
  DATABASE_MIGRATIONS, MAC_MINI_SERVER, PROJECT_OVERVIEW
- Update scripts: generate-env.mjs, setup-databases.sh, build-app.sh
- Update CI/CD: cd-macmini.yml backend → server paths
- Update Astro docs site: @chat/backend → @chat/server

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 16:52:25 +02:00
Till JS
708299b35e fix(startup): add Colima datadisk symlink safety check on boot
Prevents the internal SSD from filling up if the external SSD is not
mounted or if `colima delete` wiped the datadisk symlink.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 16:39:51 +02:00
Till JS
4fb851947e test(auth): add 68 unit tests for auth-ui, shared-auth, and shared-branding
- userAgent utils: parseUserAgent, getDeviceType, formatUserAgent (17 tests)
- guestWelcome utils: shouldShow, markSeen, reset (8 tests)
- jwtUtils: decodeToken, isTokenValid, getUserFromToken, B2B (27 tests)
- mana-apps: hasAppAccess, getTierLevel, getAccessibleManaApps (16 tests)

Also fixes iOS detection bug in userAgent parser (iPhone UA contains
"Mac OS X" — mobile check must come before desktop OS check).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 16:35:16 +02:00
Till JS
ed9672ef2b refactor(todo): remove projects concept, unify views with Fokus/Übersicht/Matrix
- Remove LocalProject, projectId from all tasks, and project-related stores/queries
- Add 'fokus' layout mode to LocalBoardView; activeLayoutMode setting in settings store
- Build FokusLayout.svelte: scroll-snap paper sheets with cross-page DnD ('task-dnd')
- Inline column edit mode: ViewColumnHeader with color picker popup, rename, reorder, delete
- Add "Neues Board" placeholder as last column in all layout modes
- PillNav now state-based (Fokus/Übersicht/Matrix tabs) instead of route-based
- Unified filter strip: merge TagStrip + FilterStrip with "Tags:" and "Filter:" label pills
- Fix all 3 test files after project removal; 100/100 tests passing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 16:34:51 +02:00
Till JS
d460c9ec07 feat(ecosystem-audit): add Tier 3 metrics (git activity, a11y, auth guard, docker)
Adds 4 new Tier 3 metrics to the ecosystem health audit script:
- Git Activity: % of apps with commits in the last 30 days (97%)
- A11y Indicators: alt-text coverage, role=dialog, focusTrap (36%)
- Auth Guard Coverage: AuthGate/authGuard presence per app (83%)
- Docker Readiness: Dockerfile present per app (80%)

Overall score updated from 74 → 72 (23 metrics, 135 total weight).
Dashboard at /manascore/ecosystem updated with new category rows.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 16:32:56 +02:00
Till JS
df1cd4bfa0 chore(calendar): remove showTasksInCalendar from localStorage migration
No existing users, so no need to clean up old localStorage keys.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 16:30:53 +02:00
Till JS
cea0c97889 fix(contacts): fix CSP blocking auth, broken contact detail modal, and missing click handler
- Add fallback URLs for connect-src in CSP (localhost:3001, :3015, :3050)
- Switch ContactDetailModal from HTTP API to IndexedDB (local-first)
- Add onclick handler to alphabet view contact cards
- Add stopPropagation on phone/email action links
- Accept non-UUID contact IDs in route regex for seed data

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 16:29:18 +02:00
Till JS
750a0c77ff refactor(calendar): remove todo integration entirely
Remove all todo/task-related code from the calendar web app:
- Delete todo API client, store, and all todo components
- Remove TodoSidebarSection, TodoDayCell, TodoRow, TaskBlock
- Remove useTaskDragDrop and useSidebarDrop composables
- Remove "Aufgaben" tab from PillNav and keyboard shortcuts
- Remove "Todo-Service ist nicht erreichbar" error banner
- Remove todo toggle from AgendaFilters, todo type from AgendaItem
- Remove PUBLIC_TODO_BACKEND_URL from server hooks
- Remove showTasksInCalendar from settings store
- Clean up i18n keys (priority, todo sections)
- Clean up help config (task shortcuts section)

Build passes successfully.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:25:34 +02:00
Till JS
e5c63f65fb fix(auth-ui): add focus traps to modals + aria-disabled on all buttons
- Add focus trap (Tab/Shift+Tab cycling) to AuthGateModal and
  GuestWelcomeModal with auto-focus on primary action
- Add aria-disabled to all disabled buttons across 8 components
  for proper screen reader announcements

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:22:25 +02:00
Till JS
201819280e feat(manascore): add Tier 2 ecosystem metrics
5 new metrics:
- Toast Consistency (100%) — all apps use shared toastStore
- Store Pattern (95%) — 176 Runes stores vs 9 old writable/readable
- Shared Types (62%) — shared-types imports vs local type files
- Dep Freshness (80%) — avg 37 deps per app
- Bundle Config (100%) — all apps have SvelteKit adapter

Ecosystem Health Score: 74/100 (19 metrics total)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:20:20 +02:00
Till JS
3b7b6c9761 refactor(auth-ui): SessionManager i18n, shared userAgent util, a11y fixes
- Add locale prop (de/en) to SessionManager with full English translations
- Extract duplicated parseUserAgent/getDeviceType to utils/userAgent.ts
- Fix hardcoded aria-label in SessionManager refresh button
- Add prefers-reduced-motion to PasskeyManager, TwoFactorSetup,
  SessionExpiredBanner

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:14:16 +02:00
Till JS
3fb1eddc04 feat(manascore): add security headers, skeleton loading, TODO count metrics
New metrics:
- Security Headers (76%) — apps with setSecurityHeaders() in hooks
- Skeleton Loading (76%) — apps with skeleton/loading state components
- TODO/FIXME Count (22 total) — technical debt info metric (not weighted)

Ecosystem Health Score: 72/100 (15 metrics total)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:13:04 +02:00