Commit graph

2401 commits

Author SHA1 Message Date
Till JS
4fba777b9b chore: add web-archived to eslint ignore pattern in lint-staged
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 20:14:49 +02:00
Till JS
2eb1a0cd76 chore: archive 25 standalone web apps, move wisekeep to apps-archived
All standalone SvelteKit web apps have been superseded by the unified
ManaCore app (apps/manacore/apps/web). Moved to web-archived/ within
each project to preserve history while removing from active workspace.

Archived: calc, cards, chat, citycorners, contacts, context, guides,
inventar, moodlit, mukke, news, nutriphi, photos, picture, planta,
presi, questions, skilltree, storage, times, zitare, todo, calendar,
uload, memoro

Moved to apps-archived/: wisekeep (not integrated, inactive)

Kept active: manacore (unified), matrix, manavoxel, arcade (separate containers)

Server, landing, and package directories remain active for each project.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 20:14:29 +02:00
Till JS
373976a11b feat(i18n): migrate help content to locale files (Phase 5)
Replace hardcoded isDE ternaries in help/index.ts with svelte-i18n lookups.
FAQ questions, answers (HTML), features, highlights, and contact info are
now in locales/help/{de,en,es,fr,it}.json — supporting all 5 languages
instead of only German and English.

32 locale modules registered, 160 JSON files total.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 18:12:45 +02:00
Till JS
033d070362 feat(i18n): replace 126 hardcoded German strings with $_() calls (Phase 4)
Systematically replace hardcoded UI strings across 48 files with svelte-i18n
$_('common.*') calls. Added 14 new common translation keys (saving, close,
create, creating, edit, add, search, settings, upload, uploading,
error_saving, error_loading, error_deleting, click_to_close) in all 5 languages.

Covers: profile modals, onboarding, workbench, calendar, cards, contacts,
context, credits, gifts, inventar, memoro, moodlit, mukke, nutriphi, photos,
picture, planta, questions, settings, skilltree, storage, subscription,
times, todo, uload — all common button/action/error strings now i18n-ready.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 18:09:10 +02:00
Till JS
2e44a717d3 feat(i18n): consolidate all 22 module translations (Phase 3)
Port i18n strings from 22 standalone apps into unified per-module locale
structure. Each module now has 5 language files (de, en, es, fr, it).

Modules added: calendar, contacts, memoro, citycorners, times, zitare,
inventar, photos, skilltree, questions, uload, chat, cards, picture,
moodlit, storage, context, presi, nutriphi, planta, calc, matrix, guides

Total: 31 locale modules, 155 JSON files, all 5 languages complete.
German and English ported from standalone apps, ES/FR/IT generated.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:53:00 +02:00
Till JS
7650a83e6e feat(manacore/web): wire reminder scheduler into app layout
Start createReminderScheduler with todoReminderSource on auth ready.
Request notification permission on app mount. Stop scheduler on destroy.
Todo reminders now fire browser notifications when dueDate - minutesBefore
is reached.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:25:31 +02:00
Till JS
034b67825a fix(manacore/web): fix TagField prop name (selectedIds, not selectedTagIds)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:24:24 +02:00
Till JS
7908995a29 feat(monitoring): structured logging, Promtail alignment, GlitchTip config, status page
- Upgrade shared-logger to dual-mode: JSON lines in production, console
  in dev. Adds configureLogger() for service name + request ID.
- Add requestLogger middleware to shared-hono with request ID generation
  and structured request/response logging.
- Align Promtail config with new JSON field names (requestId, ts, service).
- Add PUBLIC_GLITCHTIP_DSN + PUBLIC_UMAMI_WEBSITE_ID to mana-web docker config.
- Add /status page that polls all backend /health endpoints server-side.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:23:52 +02:00
Till JS
7ba82472b2 feat(manacore/web): wire TagField, FavoriteButton, ColorPicker into module UIs
Add shared TagField component (ID-based wrapper for TagSelector).
Wire TagField into: calendar EventForm, times EntryForm, cards
CreateDeckModal, contacts detail page. Wire FavoriteButton into
contacts list (replaces inline Star toggle). Add ColorPicker to
cards CreateDeckModal for deck color selection.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:20:46 +02:00
Till JS
39af8f8480 chore(manacore/web): remove dead code from todo module refactor
Delete components and stores that are no longer imported after the
pages system and workbench refactor:
- MinimizedTabs.svelte (replaced by inline tabs in todo +page)
- TagStrip.svelte (old filter strip, unused)
- TodoToolbar.svelte (old Inbox/Today/Upcoming tabs, unused)
- minimized-pages.svelte.ts store (unused)
- view.svelte.ts store (only used by deleted components)
- AppRow.svelte (old home page grid, replaced by workbench)
- ActivityFeed.svelte (old home page feed, replaced by workbench)
- Remove viewStore + minimizedPagesStore from todo/index.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:18:18 +02:00
Till JS
e7ae444b18 feat(analytics): add event tracking to remaining 12 module stores
Add analytics events to inventar, storage, memoro, mukke, presi,
moodlit, picture, calc, citycorners, and zitare stores. Also adds
new event helpers for calc, inventar, moodlit, and citycorners.

All 31 module store files now have analytics instrumentation,
up from 4 at the start of this session.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:17:07 +02:00
Till JS
5a7bc5e10d feat(manacore/web): expand EventDetailModal with full feature set
Complete rewrite of the calendar event detail modal:
- Color accent bar matching calendar color
- Date with weekday + time range + duration display
- Recurrence-aware delete dialog (this event / entire series)
- Tags display
- Copy to clipboard button
- Created/updated metadata
- Cleaner layout with better typography

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:15:49 +02:00
Till JS
8ece7d31b8 feat(analytics): add event tracking to 7 core module stores
Add analytics events to todo, calendar, contacts, chat, cards, and
photos module stores. All mutations (create, update, delete, complete,
favorite, archive) now fire the corresponding typed event helpers
with automatic module context.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:10:30 +02:00
Till JS
bfe11d91ed feat(i18n): wire user settings locale, add nav translations
- Sync svelte-i18n locale from userSettings.locale (backend) via $effect
- Persist language changes to backend via userSettings.updateGlobal
- Add nav/ locale module with navigation labels in 5 languages
- Replace 6 hardcoded German strings in app layout with $_() calls:
  "Alle Themes", "Menü", "Geschenke", "Profil", "Einstellungen", etc.
- Make baseNavItems reactive ($derived) so labels update on language change

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:08:11 +02:00
Till JS
e152098829 refactor(i18n): split monolithic locale files into per-module structure
Split 5 monolithic JSON files (de/en/es/fr/it) into 7 per-module folders
(common, dashboard, credits, profile, subscription, todo, app_slider)
with 5 language files each = 35 files total.

- Rewrite i18n/index.ts with merge-registration pattern that dynamically
  imports and merges per-module locale files at registration time
- Complete missing translations: IT (was 7% → now 100%), ES/FR (were 43% → now 100%)
- Generated missing IT translations for dashboard, credits, profile, subscription, todo
- Generated missing ES/FR translations for dashboard, credits, profile, subscription
- All 5 languages now have identical key structures across all modules

This enables scalable i18n: adding a new module = new folder + 5 JSON files + 1 line in registration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:05:14 +02:00
Till JS
8495a0d12f feat(shared-stores): add centralized keyboard shortcuts registry
createKeyboardShortcuts with register/unregister, Ctrl/Shift/Alt
modifiers, input-focus awareness, Mac Cmd support, case-insensitive
matching. Singleton keyboardShortcuts instance for app-wide use.
11 tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:03:38 +02:00
Till JS
f2d6573fa7 feat(analytics): add Web Vitals tracking, GlitchTip user context, and funnel events
- Add web-vitals package with LCP/CLS/INP/FCP/TTFB → Umami tracking
- Set GlitchTip user context on login, clear on logout
- Add funnel events: first_content_created, user_return_visit,
  second_module_used, guest_converted
- Track first content via Dexie creating hook (fires once per user)
- Track module usage via route navigation effect
- Track guest→registered conversion on signup

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:03:06 +02:00
Till JS
198720ca38 feat(shared-stores): add generic data export/import utilities
exportToJSON, exportToCSV (with BOM for Excel), importFromJSON,
downloadFile, timestampedFilename. Works with any Dexie table.
Supports filtering, column selection, custom formatters, ID
regeneration, and transform functions. 16 tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:01:53 +02:00
Till JS
4fa096147c feat(shared-stores,shared-ui): add shared reminder system
Add notificationService (Browser Notification API wrapper),
createReminderScheduler (30s poller with source pattern for checking
due reminders), and ReminderPicker UI component.

Todo module gets todoReminderSource (checks task dueDate - minutesBefore)
and ReminderSelector now delegates to shared ReminderPicker.

Scheduler supports multiple sources (todo, calendar, planta, etc.),
tag-based dedup, graceful error handling, and runtime source addition.
22 new tests (8 notification + 8 scheduler + 6 ReminderPicker).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:54:15 +02:00
Till JS
b995d52146 refactor(analytics): consolidate Umami tracking to unified app only
Remove standalone app Umami website IDs from .env.development and
generate-env.mjs. Remove injectUmamiAnalytics from all 21 standalone
app hooks.server.ts files. All analytics now flow through the single
ManaCore unified app website ID with module-level segmentation.
Landing page IDs are preserved (separate Astro sites).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:52:31 +02:00
Till JS
86d31c97f5 feat(manacore/web): expand contact detail page with all fields
Add quick actions (call, email, SMS), work section (company, position,
website), address (street/city/postal/country), social media (LinkedIn,
Twitter, Instagram, GitHub), and mobile phone to both view and edit
modes. Edit form organized in card sections matching the view layout.
Extend Contact type and store with all new fields.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:49:10 +02:00
Till JS
bc0ffb4440 fix(manacore/web): restore guest mode imports via local re-export
The pre-commit linter was stripping createGuestMode, GuestWelcomeModal,
and NotificationBar imports because it couldn't resolve them during
staged-file linting. Fix by creating a local re-export file at
$lib/stores/guest-mode.svelte.ts that the linter can resolve.

Also restore the GuestWelcomeModal and NotificationBar template blocks
that were removed by the linter.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:38:58 +02:00
Till JS
5280cc6dc7 refactor(analytics): add module context to all Umami events
Resolves event name collisions in the unified app (e.g. view_changed,
deck_created, search_performed) by adding a `module` property to every
tracked event via createModuleTracker. Also fixes duplicate tracking in
Planta routes (now only tracked in mutations.ts).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:35:27 +02:00
Till JS
779a8ba322 feat(shared-stores): add createArchiveOps factory + unify archive pattern
Standardize two-stage deletion across modules: archive (isArchived) +
soft-delete (deletedAt). Add shared factory, Archivable type mixin,
filterActive/filterArchived/filterNotDeleted query helpers. 13 tests.

Migrate memoro, chat, picture, contacts to use createArchiveOps.
Standardize picture from archivedAt timestamp to isArchived boolean.
Picture toggleFavorite now uses shared toggleField (1 param, not 2).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:33:07 +02:00
Till JS
7d3114df16 fix(manacore/web): add svelte-sonner dependency for uload settings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:31:17 +02:00
Till JS
51da1f8a59 fix(uload): add input validation, migrate clicks to dedicated table
- Add URL validation (must be valid http/https), short code uniqueness check,
  custom code format validation, maxClicks >= 1, expiresAt must be future
- Migrate uload-server click tracking from sync_changes to uload.clicks table
  for performant analytics with SQL indexes on link_id, clicked_at, country
- Migrate analytics queries from JSON aggregation on sync_changes to direct
  SQL on uload.clicks (typed columns instead of data->>'field' extraction)
- Make short URL domain configurable via PUBLIC_ULOAD_DOMAIN env var

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:30:17 +02:00
Till JS
3bd717bc93 feat(manacore/web): add unified QuickInputBar with context-aware adapters
Implement adapter pattern for the QuickInputBar that automatically
switches behavior based on the current route:
- /todo: NL task parser (priority, dates, labels, subtasks)
- /calendar: NL event parser (time, duration, recurrence, location)
- /contacts: NL contact parser (company, email, phone, tags)
- /times: search alarms and world clocks
- /planta: NL plant parser (species, care actions)
- fallback: cross-app search via SearchRegistry

Architecture: InputBarAdapter interface, lazy-loaded adapters per
module, route-reactive resolution in layout. Contact parser ported
from standalone contacts app.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:24:17 +02:00
Till JS
475ed87a41 refactor(uload): remove unused schema tables, keep only clicks
The uload-server reads links from sync_changes (local-first via mana-sync)
and never used the Drizzle schema tables (users, accounts, workspaces, links).
Strip uload-database package to only the clicks table which is needed for
performant analytics aggregation with proper SQL indexes.

- Remove 5 unused tables (users, accounts, workspaces, links, relations)
- Keep only uload.clicks with indexes on link_id, clicked_at, country, device_type
- Simplify uload-database package from ~190 LOC to ~40 LOC

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:23:33 +02:00
Till JS
d5c40a4543 feat(shared-ui): add generic ColorPicker with standard palettes
Extract TagColorPicker logic into generic ColorPicker that accepts custom
color palettes. TagColorPicker is now a thin wrapper. Add COLORS_12 and
COLORS_16 standard palettes for consistent color selection across all
modules (projects, folders, calendars, categories, etc.). 10 new tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:23:26 +02:00
Till JS
4667d5df33 feat: unified guest mode with AuthGate + createGuestMode composable
Major refactor of ManaCore's (app) layout for guest mode support:

- New createGuestMode() composable in shared-stores — encapsulates
  welcome modal state, nudge timer, and notifications in one call
- Replace monolith onMount with AuthGate + handleAuthReady callback:
  Phase A (auth-independent): DB init, migration, uload, dashboard
  Phase B (auth-dependent): sync, user settings, onboarding
  Phase C (guest-only): welcome modal + registration nudge
- Root route / always redirects to /home (no auth check)
- PillNav shows login button for guests, user email for auth users
- GuestWelcomeModal with manacore-specific features
- SessionWarning only renders for authenticated users
- Proper cleanup via onDestroy

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:22:43 +02:00
Till JS
ead4e71af5 feat(shared-ui,shared-stores): add FavoriteButton component and toggleField utility
FavoriteButton: reusable heart/star/pin toggle with filled/outline states,
accessible labels, configurable colors. toggleField: generic boolean field
toggle for Dexie records (isFavorite, isPinned, etc.) with timestamp.
Includes 11 tests (6 FavoriteButton + 5 toggleField).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:16:23 +02:00
Till JS
d49a3d727d feat(manacore/web): add tag junction tables and stores for all 23 modules
Every module now has a tag junction table in IndexedDB and a tag store
with createTagLinkOps for consistent tag-entity linking. Tags are shared
globally via globalTags; each module only manages its own junctions.

New junction tables: eventTags, contactTags, conversationTags, deckTags,
zitareListTags, songTags, presiDeckTags, invItemTags, skillTags,
ccLocationTags, entryTags, documentTags, questionTags, mealTags,
plantTags, moodTags, guideTags.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:10:49 +02:00
Till JS
be20de23db feat(manacore/web): uload feature parity — tags, analytics, settings
Port missing features from standalone uload app to unified ManaCore module:
- Add Tag Management page (/uload/tags) with CRUD, color picker, inline edit
- Replace analytics placeholder with full server dashboard (timeline chart,
  device/country/referrer breakdowns, graceful fallback when server unavailable)
- Add Settings page (/uload/settings) with data overview, JSON export, clear data
- Fix bugs: missing LocalTag type, unregistered uloadTags table, wrong table
  name in AppView (linkFolders → uloadFolders)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:10:10 +02:00
Till JS
8c98dd871d refactor(manacore/web): unify all module tags into shared globalTags
Migrate 7 modules (picture, photos, storage, memoro, times, uload, todo)
from module-specific tag tables to the shared globalTags system. Each
module now reads tags from the global pool and keeps only its junction
table for entity-tag linking via createTagLinkOps.

Removed: pictureTags, photoTags, storageTags, memoroTags, timeTags,
uloadTags, labels tables from IndexedDB schema and SYNC_APP_MAP.
Kept: all junction tables (imageTags, photoMediaTags, fileTags, etc.)
pointing to globalTags IDs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 15:34:55 +02:00
Till JS
48aac82bcb feat(shared-stores): add createTagLinkOps factory for junction tables
Reusable factory for tag-entity junction operations (addTag, removeTag,
setTags, getTagIds, hasTag) used by all modules. Also loosen ViewStore
filter constraint from Record<string, unknown> to object for interface
compatibility. Includes 14 tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 15:33:18 +02:00
Till JS
eabd9200a3 feat(manacore/web): theme-aware AppViews with inline creation
Rewrite Todo, Calendar, and Contacts AppView components for the
workbench paper-sheet pages:
- Theme-aware styling (light paper-sheet + dark mode)
- Todo: quick-add input, checkbox toggle, filter tabs
- Calendar: week strip with event dots, inline event creation
- Contacts: search + inline create form (name, email)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:33:22 +02:00
Till JS
3ea28b9065 refactor(db): consolidate ~20+ databases into 2 (mana_platform + mana_sync)
Mirrors the frontend unification (single IndexedDB) on the backend.
All services now use pgSchema() for isolation within one shared database,
enabling cross-schema JOINs, simplified ops, and zero DB setup for new apps.

- Migrate 7 services from pgTable() to pgSchema(): mana-user (usr),
  mana-media (media), todo, traces, presi, uload, cards
- Update all DATABASE_URLs in .env.development, docker-compose, configs
- Rewrite init-db scripts for 2 databases + 12 schemas
- Rewrite setup-databases.sh for consolidated architecture
- Update shared-drizzle-config default to mana_platform
- Update CLAUDE.md with new database architecture docs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:31:28 +02:00
Till JS
b1a5c95f1d refactor(inventar,times): use shared createViewStore factory
Replace ~230 LOC of duplicated view store boilerplate with 20-line
factory calls. Both modules had identical copy-pasted implementations.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:25:48 +02:00
Till JS
934f3337e3 feat(shared-stores): add createViewStore factory for view/filter/sort
Generic factory that eliminates ~110 LOC boilerplate per module for
view mode, sort, filters, and saved filter presets with localStorage
persistence. Includes 23 tests covering all store operations.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:25:31 +02:00
Till JS
de8335277a refactor(todo,photos): use shared TagChip and TagSelector components
Replace todo's custom 87-line TagSelector with thin wrapper around
shared-ui TagSelector. Replace inline tag chip HTML in TaskItem,
KanbanTaskCard, and PhotoDetailModal with shared TagChip component.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:24:34 +02:00
Till JS
04fcbd15c9 feat(shared-ui): add TagChip component and tag component tests
Add compact inline TagChip for list items/cards (smaller than TagBadge).
Set up vitest with jsdom for shared-ui package and add 44 tests covering
TagChip, TagBadge, TagColorPicker, TagSelector, and constants.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:24:19 +02:00
Till JS
f2af192172 feat(manacore/web): workbench with app pages carousel on home
Replace the static app-grid home page with a workbench carousel where
each app renders as a paper-sheet page that can be minimized, maximized,
reordered, and resized:

- AppPage.svelte: paper-sheet shell with lazy-loaded app modules
- AppPagePicker.svelte: picker showing all 23 available apps
- App component registry: maps appId to dynamic AppView imports
- Horizontal fokus-track carousel with snap-scroll
- Edit FAB with width pills (S/M/L/XL)
- Minimized tabs bar for collapsed apps
- Drag-and-drop reordering + arrow buttons in edit mode
- Workbench state persisted to IndexedDB via shared-stores
- Default layout: Todo + Calendar + Contacts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:13:28 +02:00
Till JS
3d124f04a4 feat(manacore/web): add inline QuickEventPopover for calendar
Replace the full-screen modal with a compact floating popover that
appears directly at the drag-to-create position in the week grid.
Includes title, time display, location field, and "Weitere Optionen"
link to expand into the full EventForm modal. Mobile: bottom sheet.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:12:01 +02:00
Till JS
983da8540e chore: remove orphaned jest.config.js, raise vitest coverage to 70%
- Delete jest.config.js (no jest dependency in any package.json, was dead config)
- Vitest is the sole test runner (already used by all packages)
- Raise coverage thresholds from 50% to 70% (lines, functions, branches, statements)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:11:03 +02:00
Till JS
996ec81a0e refactor(shared-python): extract shared auth package from mana-stt and mana-tts
Create packages/shared-python/manacore_auth/ with:
- auth.py: API key validation, rate limiting, local + external auth
- external_auth.py: mana-core-auth remote validation with caching
- create_auth_dependency(scope): factory for per-service auth deps

Migrated services:
- mana-stt: auth.py now wraps shared auth with scope="stt" (272→42 LOC)
- mana-tts: auth.py now wraps shared auth with scope="tts" (272→42 LOC)

The only difference between services was the scope parameter ("stt" vs "tts").
Both external_auth.py files were 100% identical and are now thin re-exports.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:09:32 +02:00
Till JS
e11aa50106 chore: remove unused Supabase auth store, archive stub services
- shared-auth-stores: delete createSupabaseAuthStore (zero usage across monorepo,
  all apps use createManaAuthStore). Remove export + types from index.ts.
- services: move ollama-metrics-proxy (stub — just a Grafana dashboard JSON) and
  it-landing (Astro landing page, not a service) to services-archived/
- lint-staged: add services-archived/ to eslint ignore pattern

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 13:59:53 +02:00
Till JS
4f70e1ca6c refactor(shared-go): extract shared auth package from 3 Go services
Create packages/shared-go/authutil/ with two JWT validator implementations:
- JWKSValidator: EdDSA JWKS validation with key caching (extracted from mana-sync)
- RemoteValidator: delegates to mana-core-auth /api/v1/auth/validate (from mana-notify/gateway)

Plus shared types (Claims, User), middleware factories (JWTMiddleware, ServiceKeyMiddleware),
context helpers (GetUser, GetUserID, GetUserRole), and token extraction.

Migrated services:
- mana-sync: internal/auth/jwt.go now wraps authutil.JWKSValidator
- mana-notify: internal/auth/auth.go now wraps authutil.RemoteValidator + ServiceKeyMiddleware
- mana-api-gateway: internal/middleware/jwt.go now wraps authutil.RemoteValidator

All 3 services compile and pass tests. Service-level packages re-export types
for backward compatibility so no consumer code changes are needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 13:27:44 +02:00
Till JS
509a541b70 feat(manacore/web): add minimized tabs bar to todo pages
Wire up the minimize/restore/maximize flow for todo pages:
- Minimized pages appear as a floating tab bar at the bottom
- Each tab shows color dot + title, with maximize and close buttons
- Click tab title to restore, click arrows-out to maximize
- Tab bar has paper-sheet aesthetic matching the pages
- Plus button on tab bar opens page picker
- Tabs slide up with animation when pages are minimized

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 13:25:08 +02:00
Till JS
97730cd9f2 feat(manacore/web): port full contact creation modal from standalone app
Expand the minimal 6-field contact form to include all sections from
the old contacts app: name, contact (email/mobile/phone), work
(company/position/website), address (street/city/postal/country),
birthday, notes, and social media (collapsible). Add mobile, street,
city, postalCode, country, and social fields to the data model.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 13:19:01 +02:00
Till JS
a4a8ff06b5 feat(manacore/web): add custom pages system to unified todo module
Port the paper-sheet pages system from standalone todo app into the
ManaCore unified app's todo module at mana.how/todo:
- Paper-sheet horizontal carousel with snap-scroll
- Edit FAB (pencil icon) toggles inline edit mode
- Custom pages with configurable filter rules (priority, date range, completed)
- PageEditBar with icon picker, filter pills, reorder arrows
- Width pills (S/M/L/XL) in edit mode
- PagePicker with preset pages + "Eigene Seite" creation
- Custom pages persisted to todoSettings

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