Commit graph

1468 commits

Author SHA1 Message Date
Till JS
135b65bcd6 test(manacore): add 48 unit tests for dashboard, API client, and credits
- Dashboard widget registry: 14 tests (types, metadata, size classes)
- Default dashboard config: 12 tests (layout, validation, i18n keys)
- Base API client: 15 tests (retry logic, auth headers, error handling)
- Credits service: 7 tests (balance, transactions, packages, usage)
- Updated audit score from 80 to 82 (testing: 12 → 48)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:26:51 +01:00
Till JS
32fba2b7b7 docs: update monitoring and error tracking documentation
- Add Quick Access section to MONITORING.md with all public URLs
- Add Umami public share links for all 15 web apps
- Add Grafana dashboard list
- Update ERROR_TRACKING.md with guest + admin credentials
- All tools publicly accessible (Grafana: anonymous, Umami: share links,
  GlitchTip: guest account)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:25:02 +01:00
Till JS
aa8197beaf docs(audit): update ManaCore production readiness audit from 65 to 80
Reassessed scores to reflect current state: 5 languages (was 2),
onboarding wizard, 11 dashboard widgets, docker-compose.macmini.yml
integration, proper mana-core-auth JWT/SSO integration. Reframed
backend/database categories for aggregator pattern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:21:35 +01:00
Till JS
764f4515c0 feat(audits): use Umami public share link instead of login credentials
Enable share_id on all 15 Umami websites. Link directly to the ManaCore
dashboard share URL - no login required.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:21:25 +01:00
Till JS
bb69f78e1e fix(auth): add missing trusted origins for cross-app SSO
Several apps (mukke, photos, planta, questions, todo, traces, context,
docs, manadeck, zitare) were missing from Better Auth's trustedOrigins,
causing SSO session cookie exchange to fail for those apps. Also synced
CORS_ORIGINS in docker-compose.macmini.yml.

Added 47 SSO contract tests to prevent regressions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:17:34 +01:00
Till JS
1486277733 feat(audits): add login credentials for all monitoring tools
- GlitchTip: guest@mana.how / guestguest
- Grafana: no login needed (anonymous viewer enabled)
- Umami: admin / umami

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:17:07 +01:00
Till JS
f264e9f2ae feat(grafana): add GlitchTip error tracking dashboard
- Add PostgreSQL datasource pointing to GlitchTip database
- Add Error Tracking dashboard with 7 panels:
  - Total Open Issues (stat)
  - Issues by Project (pie chart)
  - Total Events (stat)
  - Projects Tracked (stat)
  - Resolved vs Unresolved (stat)
  - New Issues Over Time (stacked bar chart, 30 days)
  - Recent Issues (table with 50 latest, color-coded levels)
- Dashboard links to GlitchTip UI for detailed investigation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:14:09 +01:00
Till JS
afbf5ef00a fix(nav): add missing Phosphor icons for Mukke, Context, Todo, and Storage
Added 9 missing icons to PillNavigation phosphorIcons map: music-notes,
playlist, waveform, file-text, sparkle, sparkles, share, trash, filter.
These were previously rendering as empty SVGs due to missing mappings.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:07:54 +01:00
Till JS
47f4f89b3c fix: update GlitchTip guest password to meet 8-char minimum
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:06:56 +01:00
Till JS
bc5b468d9b feat(audits): add monitoring tools section with GlitchTip guest credentials
Shows GlitchTip (error tracking), Grafana (metrics), and Umami (analytics)
links with guest login credentials directly on the audits page.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:04:13 +01:00
Till JS
ac9ce55128 refactor(nav): move feedback pill into user dropdown across all apps
Feedback is now a sub-item under the Konto (user) dropdown in PillNavigation
instead of a standalone pill in the nav bar. Added feedbackHref prop to
PillNavigation (defaults to /feedback) and removed feedback from nav items
in all 11 apps and shared app-routes config.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:00:38 +01:00
Till JS
e848fa5342 feat(mukke): display album cover art in library, playlists, and song lists
Add batch cover-url endpoint (POST /library/cover-urls) to efficiently
resolve multiple cover art presigned URLs in a single request. Integrate
cover art display across all UI surfaces: album grid, album detail header,
song list thumbnails, playlist grid, and playlist detail song list.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 20:59:45 +01:00
Till JS
789ce0a435 feat(glitchtip): enable open user registration
GlitchTip is publicly accessible like other monitoring tools (Grafana, Umami).
No login restriction needed for internal dev tooling.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 20:48:05 +01:00
Till JS
47b9e41666 feat(error-tracking): add GlitchTip integration to all 15 remaining backends
- Create instrument.ts for: chat, clock, context, manadeck, mukke,
  nutriphi, photos, picture, planta, presi, questions, skilltree,
  storage, traces, zitare
- Add import './instrument' as first line in all main.ts files
- Add @manacore/shared-error-tracking dependency to all package.json files
- Create 10 new GlitchTip projects (mukke→18, total: 18 projects)
- All 18 backends now have error tracking (active when GLITCHTIP_DSN is set)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:38:03 +01:00
Till JS
4faa0e26d2 fix(mukke): add feedback packages to web Dockerfile
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:26:49 +01:00
Till JS
442a5844f6 feat(mukke): add settings, themes, feedback, and help pages
Uses shared components: ThemePage from shared-theme-ui, SettingsPage/
SettingsSection/SettingsCard/SettingsRow from shared-ui, FeedbackPage
from shared-feedback-ui. Adds feedback and help nav items.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:26:21 +01:00
Till JS
97d5b13a38 feat(versioning): add semantic versioning and changesets to all apps
Assign version numbers based on app maturity: Calendar/Contacts/Todo (1.0.0),
Chat/Picture (0.3.0), 11 beta apps (0.2.0), Context/Planta/Questions (0.1.0),
Traces (0.0.1). Set up @changesets/cli for future version management.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 16:20:18 +01:00
Till JS
bd7129abd1 fix(glitchtip): use correct DSN format without hyphens in keys
Sentry SDK v9 rejects UUID-formatted keys with hyphens. Use the compact
hex format returned by GlitchTip's get_dsn() method.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:51:54 +01:00
Till JS
08cc1ee366 fix(mukke): add shared-splitscreen to web Dockerfile
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:51:30 +01:00
Till JS
1d1489273d refactor(mukke): replace custom sidebar with shared PillNavigation
Replaces the custom sidebar layout with PillNavigation, SplitPaneContainer,
and app switcher from shared packages. Adds theme variants, keyboard
shortcuts (Ctrl+1-5), and consistent bottom-pill navigation matching
other apps like calendar and contacts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:49:59 +01:00
Till JS
3e7fd8fd35 fix(todo): add shared-nestjs-setup dependency to todo backend
Todo main.ts was migrated to use bootstrapApp() but the dependency was missing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:45:41 +01:00
Till JS
00770415bb fix(docker): correct build order for shared packages in backend Dockerfiles
Ensure shared-nestjs-metrics, shared-nestjs-setup, and shared-error-tracking
are all built in correct dependency order before the backend build step.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:41:16 +01:00
Till JS
c1f632693d feat(mukke): add month/day fields and auto-set date from file timestamp
Adds month and day columns to songs schema. On upload, extracts the
file's lastModified date to pre-fill year/month/day. Upload form and
SongEditor now show all three date fields.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:31:50 +01:00
Till JS
8a88838300 fix(docker): add patches directory to backend Dockerfiles
pnpm install requires react-native-reanimated patch file referenced in root package.json

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:30:34 +01:00
Till JS
dcaa3c57f2 fix(docker): add shared-error-tracking and shared-nestjs-setup to backend Dockerfiles
All 3 backends (calendar, contacts, todo) need these packages copied and
built in the Docker build stage for error tracking and Swagger support.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:28:30 +01:00
Till JS
01cd7e90d2 docs(audits): update chat, picture, mukke audit reports with improved scores
Reflect production readiness improvements: Chat 74→82, Picture 72→81, Mukke 71→80.
Also fix Dockerfiles to include shared-error-tracking and shared-nestjs-setup packages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 15:24:05 +01:00
Till JS
3b8931090f fix(auth): scope pnpm install to auth service in Dockerfile
Use --filter to only install mana-core-auth and shared-storage deps,
avoiding missing workspace package errors from root package.json.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:10:08 +01:00
Till JS
baf96cbe03 fix(auth): copy patches dir in Dockerfile to fix pnpm install
pnpm resolves patch references from root package.json even for
partial workspace installs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:09:03 +01:00
Till JS
2c21f6c2bc fix(auth): use --no-frozen-lockfile in Dockerfile
The partial workspace copy causes lockfile mismatches since not all
referenced packages are present in the Docker build context.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:08:15 +01:00
Till JS
817ccfea31 fix(auth): improve email verification error detection in signIn
Better Auth may return error objects instead of throwing for unverified
emails. Now checks result.error before hasUser(), uses case-insensitive
matching, and re-throws NestJS HTTP exceptions to avoid masking them.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:05:04 +01:00
Till JS
08d19ab7ac feat(error-tracking): add GLITCHTIP_DSN to calendar, contacts, todo backends
Configures error tracking DSNs in docker-compose.macmini.yml for production:
- Calendar: project 1
- Todo: project 3
- Contacts: project 2

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:03:24 +01:00
Till JS
a35014afb5 docs: add GlitchTip error tracking documentation
- Architecture overview with container diagram
- All 8 project DSNs documented
- Backend integration guide (instrument.ts pattern)
- Shared package API reference
- Docker setup and administration commands
- Instructions for adding new apps

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 15:01:08 +01:00
Till JS
b34e787832 fix(mukke): wire up resend verification email on login and register pages
The handlers were stubs returning success without actually calling the
auth service. Now delegates to authStore.resendVerificationEmail().

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 14:57:56 +01:00
Till JS
87c61f4363 fix(glitchtip): add REDIS_URL with auth to GlitchTip containers
Redis requires authentication - GlitchTip needs REDIS_URL with password
for cache operations (session, metrics cache clearing).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 14:57:50 +01:00
Till JS
8f0c747e08 fix(chat,picture,mukke): production readiness audit fixes and tests
Chat (62→82): Add DB indexes on all tables, rate limiting (ThrottlerModule),
space authorization checks (member verification, invite permissions),
input validation DTOs with @MaxLength, complete GDPR user deletion
(templates + usage logs), fix HTML injection in hooks.server.ts.
78 tests added (conversation + space services).

Picture (68→82): Add DB indexes on all tables, foreign key constraints
with cascade rules, rate limiting, webhook endpoint security (secret
header validation), input validation on generate DTO (@Min/@Max on
dimensions/steps/guidance), transaction wrapping for board duplication
and generation completion. 70 tests added (image + board services).

Mukke (62→80): Add 73 new tests (beat, marker, project services) on top
of existing 40 tests, bringing total to 113.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 14:46:29 +01:00
Till JS
3da6cf2bd4 docs(mukke): add ID3 tag endpoints to CLAUDE.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 14:42:44 +01:00
Till JS
34c6b9c973 feat(mukke): add ID3 tag extraction, editor UI, and tag writing
Auto-extract metadata (title, artist, album, genre, year, BPM, cover art)
from uploaded files using music-metadata. Add SongEditor modal for editing
metadata in the library view. Support writing ID3 tags back to MP3 files
via node-id3.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 14:41:18 +01:00
Till JS
b11e1284dc feat(error-tracking): add GlitchTip integration with shared error-tracking package
Infrastructure:
- Add GlitchTip (web + worker) to docker-compose.macmini.yml (port 8020)
- Add glitchtip.mana.how to Cloudflare Tunnel config
- Add glitchtip database to init-db SQL
- Add GLITCHTIP_DSN to .env.development

Shared Package (@manacore/shared-error-tracking):
- initErrorTracking() - Sentry-compatible init with GlitchTip DSN
- captureException(), captureMessage(), setUser(), setTag(), flush()
- SentryExceptionFilter for NestJS (captures 5xx errors only)
- Graceful no-op when DSN is not configured

Integration:
- Add instrument.ts to calendar, contacts, todo backends
- Import instrument.ts before app bootstrap in all 3 main.ts files
- Error tracking auto-initializes when GLITCHTIP_DSN env var is set

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 13:30:13 +01:00
Till JS
54c1326c14 fix(mukke): lint fixes, rate limiting, DB indexes, and prod config
- Add ThrottlerModule rate limiting to backend
- Add DB indexes on userId, songId, playlistId columns
- Lint/formatter fixes from pre-commit hooks
- Add GlitchTip error tracking to docker-compose.macmini.yml
- Add glitchtip.mana.how to cloudflared tunnel config

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:54:49 +01:00
Till JS
212ec16125 docs(audits): update scores after Swagger and accessibility improvements
- Calendar: 92 → 94 (documentation 95→98, frontend 88→90, ux 85→88)
- Contacts: 93 → 94 (documentation 88→92, frontend 88→90, ux 82→85)
- Todo: 93 → 94 (documentation 90→95, frontend 85→88, ux 82→85)
All three now have: Swagger API docs, skip-to-content, ARIA navigation labels

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:42:12 +01:00
Till JS
9fc237d9ed feat(a11y): add skip-to-content links and ARIA labels to calendar, contacts, todo
- Add skip-to-content link ("Zum Inhalt springen") to all 3 app layouts
- Add id="main-content" to main content areas
- Add ariaLabel prop to shared PillNavigation component
- Set aria-label="Hauptnavigation" on nav elements in all 3 apps
- Add aria-label to icon-only nav toggle button in todo

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:41:23 +01:00
Till JS
217c48663b feat(swagger): add OpenAPI documentation to calendar, contacts, and todo backends
- Extend shared-nestjs-setup bootstrapApp with optional swagger config
- Auto-setup Swagger/OpenAPI when swagger: true is passed
- Add @nestjs/swagger as optional peer dependency
- Enable swagger in calendar (:3014/api/docs), contacts (:3015/api/docs), todo (:3018/api/docs)
- Migrate todo main.ts from custom bootstrap to shared bootstrapApp
- JWT Bearer auth configured in Swagger UI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:38:28 +01:00
Till JS
4c342a53e8 docs(audits): update contacts and todo scores after E2E tests
- Contacts: 91 → 93 (testing 82→88, +10 Playwright E2E tests, 150 total)
- Todo: 91 → 93 (testing 85→90, +10 Playwright E2E tests, 190 total)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:25:23 +01:00
Till JS
271836da4c test(contacts,todo): add Playwright E2E test suites
Contacts (10 tests):
- playwright.config.ts, auth fixture with storage state caching
- auth.spec.ts: login page, invalid credentials, successful login, redirect
- contacts.spec.ts: create, favorite, delete, search contact
- tags.spec.ts: create tag, search tag

Todo (10 tests):
- playwright.config.ts, auth fixture with storage state caching
- auth.spec.ts: login page, invalid credentials, successful login, redirect
- tasks.spec.ts: create, complete/uncomplete, delete task
- projects.spec.ts: create task, navigate tags, create/delete tag

Both follow Calendar's E2E pattern: custom auth fixtures, backend health
checks, German UI text, unique test data with Date.now()

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:24:50 +01:00
Till JS
7d0b2dbba8 docs(audits): update scores after controller tests and i18n expansion
- Calendar: 90 → 92 (testing 82→88, 227 total tests, 17 test files)
- Contacts: 90 → 91 (testing 78→82, 140 total tests, 11 test files)
- Todo: 90 → 91 (testing 80→85, 180 total tests, 11 test files)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:13:13 +01:00
Till JS
24a6efa453 fix(mukke): add patches dir to Dockerfiles for pnpm install
pnpm install --frozen-lockfile fails without the patches directory
because pnpm-lock.yaml references react-native-reanimated patch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:11:50 +01:00
Till JS
c15bd05305 test(calendar,contacts,todo): add controller unit tests for all 3 apps
- Calendar: 3 controller specs (calendar: 6, event: 7, event-tag: 6) → 151 total
- Contacts: 2 controller specs (contact: 9, tag: 8) → 72 total
- Todo: 2 controller specs (task: 14, project: 6) → 127 total
Uses direct instantiation pattern to avoid NestJS DI complexity in unit tests

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:09:01 +01:00
Till JS
66e2cdc989 docs(audits): update calendar, contacts, todo scores to 90
- Calendar: 76 → 90 (132 backend tests, error boundary, 5 languages)
- Contacts: 80 → 90 (55 backend tests, 5 languages, 123 total tests)
- Todo: 79 → 90 (109 backend tests, 5 languages, 162 total tests)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 11:27:07 +01:00
Till JS
eda1bd7155 feat(ux): add error boundaries and expand i18n to 5 languages
- Add +error.svelte to Calendar (blue) and Todo (emerald) web apps
- Add FR, IT, ES locale files for Contacts (216 keys each)
- Add FR, IT, ES locale files for Todo (104 keys each)
- Update i18n index.ts to register new locales
All three apps now support DE, EN, FR, IT, ES

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 11:26:30 +01:00
Till JS
42c266b09a test(todo): add 54 backend unit tests for kanban boards and reminders
- kanban.service.spec.ts: 35 tests (boards CRUD, columns CRUD, reorder, moveTask, global board)
- reminder.service.spec.ts: 19 tests (CRUD, due date validation, time calculation, bulk delete)
Total: 109 backend tests (was 55)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 11:26:26 +01:00