Commit graph

82 commits

Author SHA1 Message Date
Wuesteon
304897261d test: implement comprehensive automated testing system with daily CI/CD
Implement rock-solid automated testing infrastructure for mana-core-auth
with daily execution, notifications, and comprehensive monitoring.

Test Suite Improvements:
- Fix all 36 failing BetterAuthService tests (missing service mocks)
- Add 21 JwtAuthGuard tests achieving 100% statement coverage
- Create silentError helper to suppress intentional error logs
- Fix Todo backend TaskService test structure
- Add jose mock for JWT testing
- Configure jest collectCoverageFrom for mana-core-auth

GitHub Actions Workflow:
- Daily automated test execution (2 AM UTC + manual trigger)
- Matrix parallelization across 6 backend services
- PostgreSQL and Redis service containers
- Coverage enforcement (80% threshold)
- Multi-channel notifications (Discord, Slack, GitHub Issues)
- Support for success notifications (opt-in)

Test Infrastructure:
- Coverage aggregation across multiple services
- Flaky test detection with 30-run history tracking
- Performance metrics tracking with regression detection
- Test data seeding and cleanup scripts
- Comprehensive test reporting with formatted metrics

Documentation:
- TESTING_GUIDE.md (4000+ words) - Complete testing documentation
- AUTOMATED_TESTING_SYSTEM.md - System architecture and workflows
- DISCORD_NOTIFICATIONS_SETUP.md - Discord webhook setup guide
- TESTING_DEPLOYMENT_CHECKLIST.md - Pre-deployment verification
- TESTING_QUICK_REFERENCE.md - Quick command reference

Final Result:
- 180/180 tests passing (100% pass rate)
- Zero console errors in test output
- Automated daily testing with rich notifications
- Production-ready test infrastructure
2025-12-25 19:12:27 +01:00
Wuesteon
5b7d3c649b 🔧 chore: enforce monorepo best practices with automated validation
Fix critical issues and add validation to prevent future violations:

**Fixes:**
- Remove turbo recursion in 5 app packages (infinite loop risk)
- Add "private": true to 11 packages (prevent accidental publishing)
- Rename @mana-core/nestjs-integration → @manacore/nestjs-integration
- Remove prepublishOnly scripts from 3 private packages

**New:**
- Add scripts/validate-monorepo.mjs with 4 critical checks
- Add validate:monorepo command to package.json
- Integrate validation into CI pipeline (.github/workflows/ci.yml)
- Document validation in CLAUDE.md

All 80 package.json files now pass validation 

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-25 17:57:00 +01:00
Wuesteon
9bba76133b fix todo backend docker file 2025-12-25 17:07:55 +01:00
Wuesteon
42bb44b747 Merge branch 'till-dev' into dev 2025-12-24 22:49:01 +01:00
Wuesteon
bb4189f942 Merge branch 'dev' into till-dev 2025-12-19 19:29:29 +01:00
Wuesteon
74654e652a 🐛 fix(cors): compile shared-nestjs-cors to JavaScript for production
The shared-nestjs-cors package was exporting raw TypeScript files, which caused
runtime errors in production Docker containers:
  SyntaxError: Unexpected token 'export'

Changes:
- Add build script to compile TypeScript to JavaScript
- Update package.json to export compiled dist files instead of src
- Add build step to all backend Dockerfiles that use this package
- Package now builds to CommonJS in dist/ folder

Fixes staging deployment failures for mana-core-auth and other backends.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-17 18:42:47 +01:00
Wuesteon
1be3d7a3ae 🐛 fix(docker): add missing workspace dependencies to all Dockerfiles
Ensure all backend Dockerfiles copy and build ALL workspace dependencies
they need. This fixes Docker build failures where packages couldn't find
their @manacore/* dependencies.

**Changes:**

**Picture Backend:**
- Added better-auth-types (with build)
- Added mana-core-nestjs-integration (with build)
- Added shared-nestjs-auth (with build)
- Added shared-storage (with build)

**Chat Backend:**
- Added mana-core-nestjs-integration (with build)

**Calendar, Clock, Todo Backends:**
- Added shared-nestjs-cors (already had other deps)

**Mana Core Auth:**
- Restructured for monorepo workspace support
- Added shared-nestjs-cors

**Key Improvements:**
- All packages in alphabetical order
- Build steps for compiled packages
- Source-only packages (shared-nestjs-cors) skip build
- Proper dependency ordering in build steps

This ensures Docker builds work correctly after the CORS package addition.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-17 18:19:29 +01:00
Wuesteon
4c44764838 1. Brevo email integration (API key, sender settings)
2. URL configuration fix (BASE_URL, FRONTEND_URL)
  3. Password reset URL pointing to frontend instead of API
2025-12-17 18:11:13 +01:00
Wuesteon
d3e11b320a 🐛 fix(auth): require name field in registration forms
Add required name field (min 2 chars) to all registration forms to fix
Better Auth validation error. Updates backend DTO, shared-auth service,
shared-auth-ui RegisterPage component, i18n translations, and all app
auth stores and register pages.
2025-12-16 20:28:28 +01:00
Wuesteon
f37f85eded 🐛 fix(docker): add better-auth-types to backend Dockerfiles
Add missing @manacore/better-auth-types package to backend Docker builds.
The shared-nestjs-auth package depends on this new types package.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 03:14:45 +01:00
Wuesteon
cd19106857 🐛 fix(docker): add better-auth-types to web app Dockerfiles
Add missing @manacore/better-auth-types package to Docker builds.
The shared-auth package now depends on this new types package.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 02:59:51 +01:00
Wuesteon
263d779436 🐛 fix: resolve CI/CD build failures for manacore-web and todo-web
- Replace lucide-svelte with @lucide/svelte (Svelte 5 runes compatible)
- Add shared-splitscreen and shared-types to todo-web Dockerfile
- Update pnpm-lock.yaml with new dependencies

The old lucide-svelte package used $$props (Svelte 4 syntax) which
fails in Svelte 5 runes mode. The new @lucide/svelte package is
built specifically for Svelte 5.
2025-12-15 19:40:19 +01:00
Wuesteon
42e5e97390 ️ fix: resolve all svelte-check a11y warnings across web apps
- Fix 121 accessibility warnings across 9 web apps (manacore, clock, chat,
  manadeck, calendar, zitare, contacts, picture, todo)
- Add proper ARIA attributes (role, tabindex, aria-label) to interactive elements
- Add onkeydown handlers alongside onclick for keyboard accessibility
- Add svelte-ignore comments for intentional patterns (modals, dropdowns)
- Update svelte-check threshold from error to warning in pre-commit hook
- Fix script compatibility for bash 3.x (remove associative arrays)
- Add comprehensive documentation for svelte-check patterns and fixes

All web apps now pass svelte-check with 0 errors and 0 warnings.
Pre-commit hooks will block any future commits with warnings.
2025-12-15 19:09:01 +01:00
Wuesteon
660cbd654f Merge branch 'dev' into till-dev 2025-12-15 14:10:34 +01:00
Till-JS
893c6ef0fb feat(shared-ui): unify ImmersiveModeToggle across Calendar, Contacts, and Todo apps
- Move ImmersiveModeToggle component from Calendar to shared-ui package
- Add immersiveModeEnabled setting to Contacts and Todo settings stores
- Update all three app layouts with F-key shortcut and conditional UI rendering
- Consistent glass-pill styling on hover for toggle button

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 03:34:15 +01:00
Wuesteon
0fa154c7d6 🐛 fix(shared-auth): add automatic token refresh on 401 responses
- Add backendUrl parameter to initializeWebAuth() for interceptor config
- Expand isTokenExpiredResponse() to match more error patterns:
  - "invalid token", "token validation failed", "claim" (jose errors)
  - ERR_JWT_EXPIRED error code
- Update all web apps to pass backendUrl for automatic refresh:
  - picture (3006), chat (3002), zitare (3007), contacts (3015)
  - calendar (3014), clock (3017), todo (3018)
- Fix API client default port in picture web app

This prevents users from being randomly signed out when JWT expires.
The interceptor now catches 401 responses and automatically refreshes
the token before retrying the request.
2025-12-12 20:47:43 +01:00
Till-JS
f2ac3e245e feat(splitscreen): add split-screen feature for multi-app side-by-side view
Add new @manacore/shared-splitscreen package enabling iFrame-based
split-screen functionality across Calendar, Todo, and Contacts apps.

Features:
- SplitPaneContainer with CSS Grid layout
- AppPanel with iFrame sandbox permissions and loading/error states
- ResizeHandle with mouse, touch, and keyboard support (20-80% range)
- PanelControls for swap and close actions
- Svelte 5 runes-based store with Context API
- URL persistence (?panel=todo&split=60)
- localStorage persistence with versioning
- Mobile auto-disable (<1024px breakpoint)

Integration:
- PillNavigation: added onOpenInPanel prop and Ctrl/Cmd+click support
- PillDropdown: added split button per app item
- Calendar, Todo, Contacts layouts wrapped with SplitPaneContainer

Also fixes:
- WeekView.svelte: fixed {@const} placement error
- MultiDayView.svelte: fixed {@const} placement error

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 13:00:26 +01:00
Till-JS
7d03a524fc fix: misc UI improvements across todo and shared-tailwind
- Update Todo main page layout
- Fix DateStrip component styling
- Adjust themes.css color variables

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 02:42:25 +01:00
Till-JS
0f10a38cc0 feat(shared-ui): add QuickInputBar and PillToolbar components
- Add QuickInputBar component with natural language parsing, syntax
  highlighting, search, and quick-create functionality
- Add PillToolbar, PillToolbarButton, PillToolbarDivider components
  for app-specific toolbar controls
- Add PillTimeRangeSelector for hour range selection
- Add PillViewSwitcher for view mode switching with sliding indicator
- Integrate QuickInputBar into Calendar, Contacts, and Todo apps
- Add app-specific toolbars: CalendarToolbar, ContactsToolbar, TodoToolbar
- Add DateStrip component for Calendar date navigation
- Fix type exports: export QuickAction and CreatePreview from quick-input
  module, remove duplicate exports from deprecated command-bar

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 02:17:17 +01:00
Wuesteon
5921cfd257 Merge branch 'till-dev-backup' into till-dev 2025-12-11 18:48:28 +01:00
Till-JS
0ecbf69ebc feat(contacts): integrate contacts into Todo and Calendar apps
- Add ContactSelector, ContactBadge, ContactAvatar to shared-ui
- Add ContactsClient API service to shared-auth
- Add ContactReference, ContactSummary types to shared-types
- Todo: Add assignee and involvedContacts to tasks with UI in TaskEditModal
- Todo: Display contacts in TaskItem and KanbanTaskCard
- Calendar: Add AttendeeSelector with RSVP status support
- Calendar: Integrate attendees in EventForm
- Calendar: Add task drag-drop to calendar views (Day/Week/MultiDay)
- Contacts: Add ContactTasks component to show related tasks
- Backend: Add findByContact endpoint to Todo task service
- UI polish: glassmorphism styling, keyboard navigation, auto-focus

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 18:14:35 +01:00
Till-JS
309faba62c feat(contacts): integrate contacts into Todo and Calendar apps
- Add ContactSelector, ContactBadge, ContactAvatar to shared-ui
- Add ContactsClient API service to shared-auth
- Add ContactReference, ContactSummary types to shared-types
- Todo: Add assignee and involvedContacts to tasks with UI in TaskEditModal
- Todo: Display contacts in TaskItem and KanbanTaskCard
- Calendar: Add AttendeeSelector with RSVP status support
- Calendar: Integrate attendees in EventForm
- Calendar: Add task drag-drop to calendar views (Day/Week/MultiDay)
- Contacts: Add ContactTasks component to show related tasks
- Backend: Add findByContact endpoint to Todo task service
- UI polish: glassmorphism styling, keyboard navigation, auto-focus

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 16:00:08 +01:00
Till-JS
6bc3c0998c feat(todo): configure nav items for visibility settings
Pass app-specific navigation items to GlobalSettingsSection.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:08 +01:00
Till-JS
6c2d603a1a feat(todo): add inline tag creation with color palette
Replace modal-based tag creation with inline form and preview.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:08 +01:00
Till-JS
a898160423 refactor(todo): rename Labels to Tags for consistency across apps
- Rename route /labels to /tags and /label/[id] to /tag/[id]
- Rename LabelSelector component to TagSelector
- Update all UI texts from "Labels" to "Tags"
- Update navigation items and references
- Align terminology with Calendar and Contacts apps

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:08 +01:00
Till-JS
75bf7ecf47 fix(todo): improve drag-and-drop reliability with ID-based sync
Use sorted task IDs instead of array reference to detect real changes
from parent. Update lastTaskIds after finalize to prevent $effect from
reverting local DnD state changes.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:08 +01:00
Till-JS
aeb6a15994 feat(command-bar): match priority highlight colors to UI
Priority keywords now show their actual UI colors:
- Dringend (urgent): red #ef4444
- Wichtig (high): orange #f97316
- Normal (medium): yellow #eab308
- Später (low): green #22c55e

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:07 +01:00
Till-JS
993b8c129a fix(todo): allow priority keywords without ! prefix
Now supports both:
- "heimfahren wichtig" → priority high
- "heimfahren !wichtig" → priority high

Keywords: später, normal, wichtig, dringend (case-insensitive)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:07 +01:00
Till-JS
330b9907b0 refactor(todo): rename priority labels for better natural language input
- low → "Später" (was "Niedrig")
- medium → "Normal" (was "Mittel")
- high → "Wichtig" (was "Hoch")
- urgent → "Dringend" (unchanged)

CommandBar syntax now supports: !später, !normal, !wichtig, !dringend
Shortcut syntax still works: !, !!, !!!

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:07 +01:00
Till-JS
74604b09d3 feat(todo): add deep validation for DTOs and completed task pagination
Validation:
- Create SubtaskDto with title MinLength/MaxLength, order validation
- Create TaskMetadataDto with typed EffectiveDuration, storyPoints enum
  validation (Fibonacci only), funRating bounds (1-10)
- Use @ValidateNested with @Type() for deep validation in CreateTaskDto

Pagination:
- Add offset parameter and total count to getCompletedTasks()
- Return { tasks, total, hasMore } structure for frontend pagination
- Enforce max limit of 100 to prevent abuse
- Add 3 pagination tests (basic, offset, max enforcement)

Error handling:
- Add try-catch to localStorage operations in +layout.svelte
- Handles private browsing mode and quota exceeded errors gracefully

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:07 +01:00
Till-JS
b1877c4a08 feat: add unified CommandBar Quick-Create for Calendar and Contacts
Implements the same CommandBar quick-create functionality from Todo
in Calendar and Contacts apps with a shared base parser architecture.

- Add base-parser in shared-utils with common patterns (date, time, tags)
- Refactor task-parser to use base-parser
- Create event-parser for Calendar with duration, location, @calendar
- Create contact-parser for Contacts with email, phone, @company detection
- Integrate Quick-Create into Calendar and Contacts layouts

Natural language syntax:
- Common: heute, morgen, Montag, 15.12., um 14 Uhr, #tags
- Calendar: für 2h, 30 min, in Berlin, @Kalender, ganztägig
- Contacts: @Firma, bei Company, auto email/phone detection

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:07 +01:00
Till-JS
c6b48d8f95 fix(todo): add input validation, N+1 fix, and RRULE bounds checking
Security & Validation:
- Add @IsNotEmpty and @MinLength(1) validators to prevent empty inputs
  - CreateTaskDto.title
  - CreateLabelDto.name
  - CreateProjectDto.name
- Add German error messages for validation failures

Performance:
- Fix N+1 query in network.service.ts getGraph()
  - Batch load all task-label relationships in single query
  - Reduces queries from O(n) to O(1) for label fetching

Security:
- Add validateRRule() to prevent DoS via malicious recurrence rules
  - Reject rules > 500 chars
  - Reject rules with > 5000 occurrences in 10 years
  - Prevents hourly/minutely abuse while allowing daily tasks

Cleanup:
- Remove debug console.log from tasks.svelte.ts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:07 +01:00
Till-JS
828dbcc017 refactor(todo-web): extract reusable form components from TaskEditModal
Extract 5 form components to reduce TaskEditModal from 1220 to 604 lines (51%):

- PrioritySelector: Task priority selection buttons with color indicators
- StorypointsSelector: Fibonacci story point picker (1,2,3,5,8,13,21)
- DurationPicker: Quick duration buttons + custom input for effective time
- FunRatingPicker: 1-10 rating scale with color-coded visual feedback
- LabelSelector: Dropdown for multi-select label assignment

These components are now reusable across other task forms and views.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:06 +01:00
Till-JS
89a2b3da9e feat(todo): add quick task creation via CommandBar
- Add natural language parser for task input (date, time, priority, project, labels)
- Extend CommandBar with onCreate/onParseCreate callbacks
- Show create preview with parsed attributes as first option
- Support Cmd/Ctrl+Enter to create directly
- Fix service worker to not intercept Vite dev server requests
- Update deprecated apple-mobile-web-app-capable meta tag

Example: "Meeting morgen 14 Uhr !hoch @Arbeit #wichtig"
→ Creates task with due date, time, priority, project and label

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:06 +01:00
Till-JS
d8f1bbbbce fix(todo-backend): implement recurrence handling and fix N+1 query
- Implement recurring task handling using rrule library
  - createNextOccurrence() creates next task instance when completing recurring task
  - calculateNextStartDate() maintains offset between start/due dates
  - Copies labels, subtasks (reset), and metadata to new occurrence
  - Respects recurrenceEndDate limit

- Fix N+1 query problem for task labels
  - Replace individual loadTaskLabels() calls with batch loadTaskLabelsBatch()
  - Reduces database queries from O(2n) to O(2) for task lists
  - Uses Maps for O(1) lookups when combining tasks with labels

- Add Jest test coverage (25 tests)
  - CRUD operations, task status changes, recurrence
  - Special queries (inbox, today, completed)
  - Batch loading efficiency verification

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 21:12:06 +01:00
Wuesteon
39b04e4b34 🐛 fix(auth): enable automatic token refresh across all web apps
Users were getting signed out after ~15 minutes because API clients were
reading tokens directly from localStorage without triggering the refresh
logic. The tokenManager exists with proper refresh capability but was
never being used.

Changes:
- Add getValidToken() method to auth stores in 9 web apps
- Update API clients to use authStore.getValidToken() instead of localStorage
- Token refresh now happens proactively before requests fail

Apps updated: chat, calendar, picture, zitare, contacts, todo, clock, manacore, manadeck

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-10 20:52:29 +01:00
Till-JS
1040b54058 fix(calendar): fix Todo integration and show all tasks in sidebar
- Fix /tasks/upcoming endpoint 500 error (Invalid time value)
- Use inArray instead of or() for batch label loading
- Show all todos in sidebar (overdue + today + upcoming)
- Make todo list scrollable with max-height
- Improve error handling: don't mark service unavailable if today tasks loaded

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 20:34:25 +01:00
Till-JS
812a6f5090 fix(todo): resolve type errors and update component props
- Fix KanbanColumn to use DndEvent type from svelte-dnd-action
- Extend UpdateTaskDto and store updateTask method to support all task fields
- Add metadata type cast in +page.svelte for compatibility
- Create feedback service and update FeedbackPage to use new API
- Fix forgot-password page: rename handler to onForgotPassword, use titleForm
- Remove deprecated enableGoogle/enableApple props from RegisterPage

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 20:16:17 +01:00
Till-JS
0b28eba3f2 chore: various UI improvements and fixes
Calendar:
- Fix EventDetailModal and QuickEventOverlay component updates
- Update TodoDetailModal and TodoItem components
- Remove unused settings section code
- Fix network page styling

Todo Backend:
- Improve task service validation

Shared UI:
- Update Card, DataCard, Input components with improvements
- Enhance TagBadge with better color handling
- Fix TagEditModal and TagList components
- Update PillNavigation and PillDropdown styling
- Add NetworkGraph improvements
- Update CommandBar, FormModal, AppsPage components
- Fix chart types and GlobalSettingsSection

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 20:05:02 +01:00
Till-JS
108e69d3d0 feat(todo): configure nav items for visibility settings
Pass app-specific navigation items to GlobalSettingsSection.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 16:00:04 +01:00
Till-JS
adb6d06232 feat(todo): add inline tag creation with color palette
Replace modal-based tag creation with inline form and preview.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 15:59:34 +01:00
Till-JS
9f13bba3d0 refactor(todo): rename Labels to Tags for consistency across apps
- Rename route /labels to /tags and /label/[id] to /tag/[id]
- Rename LabelSelector component to TagSelector
- Update all UI texts from "Labels" to "Tags"
- Update navigation items and references
- Align terminology with Calendar and Contacts apps

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 15:21:33 +01:00
Till-JS
6b30a914f4 fix(todo): improve drag-and-drop reliability with ID-based sync
Use sorted task IDs instead of array reference to detect real changes
from parent. Update lastTaskIds after finalize to prevent $effect from
reverting local DnD state changes.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 15:09:10 +01:00
Till-JS
aa117c51cd feat(command-bar): match priority highlight colors to UI
Priority keywords now show their actual UI colors:
- Dringend (urgent): red #ef4444
- Wichtig (high): orange #f97316
- Normal (medium): yellow #eab308
- Später (low): green #22c55e

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 15:06:22 +01:00
Till-JS
96916599a6 fix(todo): allow priority keywords without ! prefix
Now supports both:
- "heimfahren wichtig" → priority high
- "heimfahren !wichtig" → priority high

Keywords: später, normal, wichtig, dringend (case-insensitive)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 14:57:37 +01:00
Till-JS
a0306bab7d refactor(todo): rename priority labels for better natural language input
- low → "Später" (was "Niedrig")
- medium → "Normal" (was "Mittel")
- high → "Wichtig" (was "Hoch")
- urgent → "Dringend" (unchanged)

CommandBar syntax now supports: !später, !normal, !wichtig, !dringend
Shortcut syntax still works: !, !!, !!!

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 14:52:11 +01:00
Till-JS
56269a5829 feat(todo): add deep validation for DTOs and completed task pagination
Validation:
- Create SubtaskDto with title MinLength/MaxLength, order validation
- Create TaskMetadataDto with typed EffectiveDuration, storyPoints enum
  validation (Fibonacci only), funRating bounds (1-10)
- Use @ValidateNested with @Type() for deep validation in CreateTaskDto

Pagination:
- Add offset parameter and total count to getCompletedTasks()
- Return { tasks, total, hasMore } structure for frontend pagination
- Enforce max limit of 100 to prevent abuse
- Add 3 pagination tests (basic, offset, max enforcement)

Error handling:
- Add try-catch to localStorage operations in +layout.svelte
- Handles private browsing mode and quota exceeded errors gracefully

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 14:38:11 +01:00
Till-JS
68c7bfb8a7 feat: add unified CommandBar Quick-Create for Calendar and Contacts
Implements the same CommandBar quick-create functionality from Todo
in Calendar and Contacts apps with a shared base parser architecture.

- Add base-parser in shared-utils with common patterns (date, time, tags)
- Refactor task-parser to use base-parser
- Create event-parser for Calendar with duration, location, @calendar
- Create contact-parser for Contacts with email, phone, @company detection
- Integrate Quick-Create into Calendar and Contacts layouts

Natural language syntax:
- Common: heute, morgen, Montag, 15.12., um 14 Uhr, #tags
- Calendar: für 2h, 30 min, in Berlin, @Kalender, ganztägig
- Contacts: @Firma, bei Company, auto email/phone detection

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 14:37:01 +01:00
Till-JS
4197b61622 fix(todo): add input validation, N+1 fix, and RRULE bounds checking
Security & Validation:
- Add @IsNotEmpty and @MinLength(1) validators to prevent empty inputs
  - CreateTaskDto.title
  - CreateLabelDto.name
  - CreateProjectDto.name
- Add German error messages for validation failures

Performance:
- Fix N+1 query in network.service.ts getGraph()
  - Batch load all task-label relationships in single query
  - Reduces queries from O(n) to O(1) for label fetching

Security:
- Add validateRRule() to prevent DoS via malicious recurrence rules
  - Reject rules > 500 chars
  - Reject rules with > 5000 occurrences in 10 years
  - Prevents hourly/minutely abuse while allowing daily tasks

Cleanup:
- Remove debug console.log from tasks.svelte.ts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 14:25:24 +01:00
Till-JS
8b9337ac72 refactor(todo-web): extract reusable form components from TaskEditModal
Extract 5 form components to reduce TaskEditModal from 1220 to 604 lines (51%):

- PrioritySelector: Task priority selection buttons with color indicators
- StorypointsSelector: Fibonacci story point picker (1,2,3,5,8,13,21)
- DurationPicker: Quick duration buttons + custom input for effective time
- FunRatingPicker: 1-10 rating scale with color-coded visual feedback
- LabelSelector: Dropdown for multi-select label assignment

These components are now reusable across other task forms and views.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 14:18:26 +01:00