Commit graph

368 commits

Author SHA1 Message Date
Till-JS
25fd0c25ee feat(contacts): add archive link to settings page
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 20:47:56 +01:00
Till-JS
5cf9f81242 feat(contacts): improve network page with contact detail sidebar
- Use original ContactDetailModal as sidebar when clicking nodes
- Add glass effect (backdrop-filter blur) to NetworkControls and sidebar
- Position controls bar on the left side
- Add $effect to reload contact when contactId changes
- Remove shadows for cleaner glass appearance

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 20:46:16 +01:00
Till-JS
fb7c78868b feat(ui): add Phosphor Icons to PillNavigation
- Replace SVG path icons with Phosphor Icons via @manacore/shared-icons
- Add icon mapping for all navigation icons (help-circle, share-2, etc.)
- Update help page design with glass-morphism styling
- Icons now render consistently across all navigation items

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 20:40:44 +01:00
Till-JS
7987fe009d feat(ui): add skeleton loaders for calendar and clock apps
Calendar App:
- Add AppLoadingSkeleton for root layout initialization
- Add CalendarViewSkeleton for main week view
- Add AgendaSkeleton for agenda page event list
- Add EventDetailSkeleton for event modal
- Add RedirectSkeleton for event redirect page
- Fix TypeScript error in event/new page

Clock App:
- Add AppLoadingSkeleton for root layout initialization
- Add WorldClockSkeleton for world clock grid
- Add AlarmsSkeleton for alarms grid
- Add TimersSkeleton for active timers grid

All spinners replaced with contextual skeleton loaders using
@manacore/shared-ui SkeletonBox component.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 20:36:37 +01:00
Till-JS
a4846aea06 feat(shared-ui): add global CommandBar component with search across apps
- Add reusable CommandBar component to shared-ui package with dark theme
- Integrate CommandBar (Cmd/K) in contacts, calendar, todo, and clock apps
- Implement search functionality for each app:
  - Contacts: search by name, company, email with relevance-based sorting
  - Calendar: search events by title/description within next year
  - Todo: search tasks by title/description
  - Clock: search alarms and timers by label
- Add quick actions for common operations in each app

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 20:35:58 +01:00
Till-JS
2b3f92ff36 feat(contacts): add interactive network graph visualization
- Add NetworkModule backend with tag-based relationship detection
- Create D3-force powered network graph component with zoom/pan/drag
- Implement network store with Svelte 5 runes for state management
- Add floating controls for search, filter by tag/company, and zoom
- Full-screen graph layout with sidebar for selected contact details
- Contacts are connected when they share common tags

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 20:29:38 +01:00
Till-JS
1dda437192 feat(help): add centralized help system with shared packages
- Add @manacore/shared-help-types with TypeScript types and Zod schemas
- Add @manacore/shared-help-content with Markdown parser, content loader, and Fuse.js search
- Add @manacore/shared-help-ui with Svelte 5 components (HelpPage, FAQSection, FeaturesOverview, etc.)
- Add @manacore/shared-help-mobile with React Native components for Expo apps
- Add help translations to shared-i18n (de, en, fr, it, es)
- Implement self-contained help page in Contacts app with FAQ, Features, Shortcuts, and Contact sections
- Support i18n with German and English content

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 20:24:22 +01:00
Till-JS
b6158a89a6 feat(ui): add comprehensive skeleton loaders for contacts and todo apps
- Add shared skeleton primitives to @manacore/shared-ui:
  - SkeletonAvatar, SkeletonCard, SkeletonRow, SkeletonList, SkeletonGrid

- Add contacts app skeletons:
  - AppLoadingSkeleton for root layout auth loading
  - ContactListSkeleton, ContactGridSkeleton for contact views
  - ContactDetailSkeleton for modal loading
  - ContactNotesSkeleton for notes section
  - TagGridSkeleton, FavoriteGridSkeleton for respective pages
  - DuplicateListSkeleton for duplicates page
  - ImportPreviewSkeleton, GoogleImportSkeleton for import flows
  - NetworkGraphSkeleton for network visualization

- Add todo app skeletons:
  - AppLoadingSkeleton for root layout
  - TaskListSkeleton with configurable sections
  - StatisticsSkeleton for stats page charts
  - KanbanBoardSkeleton, KanbanColumnSkeleton for kanban view

- Replace all spinner loading indicators with skeleton loaders
- All skeletons include proper accessibility attributes

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 19:41:19 +01:00
Till-JS
99c28242c5 refactor(contacts): consolidate groups into tags feature
Remove groups functionality and use only tags for contact organization.
Tags provide a simpler, more intuitive approach for categorizing contacts.

Frontend changes:
- Remove groups pages (/groups, /groups/new, /groups/[id])
- Remove groups from navigation
- Update FilterBar to use tags instead of groups
- Update ContactList to use selectedTagId
- Remove groupsApi and batch group operations
- Update i18n translations (group → tag)

Backend changes:
- Remove GroupModule and group controller/service
- Remove groups.schema.ts and contact_to_groups relation
- Remove group-related batch operations (addToGroup, removeFromGroup)
- Remove groupId filtering from contacts and export
- Remove preset groups from seed.ts

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 18:15:32 +01:00
Till-JS
05dd9a0063 fix(contacts): remove groups store dependency from data page
- Remove groupsStore import and usage from data/+page.svelte
- Remove group filter from export options (groups feature not implemented)
- Clean up export button removal from ContactList

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 18:07:56 +01:00
Till-JS
4e5d12aa53 feat(contacts): add enhanced favorites page with multiple view modes
- Add quick favorites filter button on homepage with badge count
- Create dedicated favorites page with hero header and stats cards
- Implement three view modes for favorites: cards, list, alphabet
  - Cards: Large 120px avatars with gradient backgrounds, full contact details
  - List: 72px avatars with detail chips and hover actions
  - Alphabet: Grouped by letter with quick-jump navigation
- Fix layout jump when favorites filter is active (exclude from FilterBar count)
- Add tags management feature with CRUD operations
- Reorganize import page to /data route
- Add infinite scroll to contacts list
- Add contact notes feature
- Persist favorites view mode in localStorage

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 18:00:55 +01:00
Till-JS
76f573fb08 refactor(shared-ui): convert settings components from scoped CSS to Tailwind
- SettingsCard, SettingsSection, SettingsRow now use Tailwind classes
- SettingsToggle, SettingsSelect, SettingsNumberInput updated
- SettingsTimeInput, SettingsDangerZone, SettingsDangerButton updated
- SettingsPage updated with Tailwind layout classes
- Fixes dark mode styling issues when components used across packages

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 17:49:07 +01:00
Till-JS
09599c2a92 refactor(shared-ui): convert SettingsSelect from CSS to Tailwind classes
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 17:46:08 +01:00
Till-JS
dd40bb40e7 feat(contacts): add duplicate detection, photo upload, and batch operations
- Add duplicate detection service with merge functionality
  - Find duplicates by email, phone, or name
  - Merge contacts with field selection UI
  - Dismiss false positives

- Add contact photo upload
  - Upload photos to MinIO/S3 storage
  - Display photos in all contact views
  - Delete photo functionality

- Add batch operations for multiple contacts
  - Selection mode with checkboxes in all views
  - Batch delete, archive, and favorite actions
  - Fixed-height action bar to prevent layout shifts

- Add multiple contact view modes
  - List view, Grid view, Alphabet view
  - View mode toggle component
  - Sort by first/last name

- Increase avatar sizes across all views

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 17:45:29 +01:00
Wuesteon
23c2d85f6e 📝 docs(cicd): add comprehensive deployment guide with CI/CD architecture 2025-12-09 15:02:44 +01:00
Till-JS
a52e518a98 Docs 2025-12-09 14:48:53 +01:00
Till-JS
c88626d26b feat(todo): add multiple kanban boards with task editing features
- Add multiple boards support with board navigation (pill-style)
- Add global board for all tasks
- Board CRUD operations with color/icon customization
- Task detail modal: click on card opens full edit modal
- Inline title editing: double-click on title for quick edit
- Right-click context menu: edit, complete, delete actions
- Responsive board navigation (top on desktop, bottom on mobile)
- Remove flip animations for cleaner board switching

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 14:41:50 +01:00
Till-JS
1ac74c9bf5 feat(todo): add PWA support with offline capabilities
- Add web app manifest with app metadata and shortcuts
- Add service worker with network-first, cache-first, and network-only strategies
- Add offline fallback page with auto-reload on reconnection
- Add SVG placeholder icon for PWA
- Add PWA meta tags for iOS, Android, and Windows support
- Add comprehensive PWA guide documentation (docs/PWA_GUIDE.md)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 14:40:42 +01:00
Till-JS
d45a9db3fc feat(todo): add statistics page with visualizations
Add comprehensive statistics dashboard with:
- StatsOverview: Quick stats cards (completed today/week, active, overdue)
- ActivityHeatmap: GitHub-style contribution graph (6 months)
- WeeklyTrendChart: Line chart showing 4-week completion trend
- PriorityDonutChart: Interactive donut chart for priority breakdown
- ProjectProgressBars: Progress bars per project

Features:
- Custom SVG visualizations (no external chart libraries)
- Glass-pill design matching app aesthetic
- Dark mode support
- Responsive grid layout
- Statistics store with computed derivations
- Navigation link added to PillNav
- PWA service worker registration

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 14:37:44 +01:00
Till-JS
0c2434bd1d feat(todo): add task metadata fields and mana page
- Add storyPoints, effectiveDuration, funRating to TaskMetadata
- Add UI controls in TaskEditModal for new metadata fields
- Add columns/kanban icon to shared-ui PillNavigation
- Add Mana subscription page to todo app
- Update TASK_METADATA.md documentation

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 14:29:56 +01:00
Till-JS
3e35e6a2f4 feat(todo): add task edit modal and fix task loading
- Add TaskEditModal with full task editing (title, description, dates,
  priority, status, project, labels, subtasks, recurrence, notes,
  storypoints, duration, fun rating)
- Add SubtaskList component with drag-and-drop reordering
- Add onEdit prop to TaskItem and TaskList for modal integration
- Fix task loading on homepage by simplifying fetchAllTasks to load
  all tasks without isCompleted filter
- Fix isCompleted query parameter parsing in backend DTO

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-09 14:04:11 +01:00
Till-JS
863dd621f5 feat(todo): add comprehensive settings page with 20+ preferences
- Add global settings: confirmOnDelete, keyboardShortcutsEnabled
- Create Todo-specific settings store with localStorage persistence
- Add new shared-ui components: SettingsSelect, SettingsNumberInput, SettingsTimeInput
- Redesign settings page with 6 new sections:
  - Task behavior (priority, due time, auto-archive, quick-add project)
  - View & display (default view, compact mode, task counts, subtask progress)
  - Kanban board (card size, labels, WIP limit)
  - Notifications (reminders, daily digest, overdue alerts)
  - Productivity (focus mode, pomodoro, daily goal, streak)
  - Keyboard shortcuts

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 13:30:02 +01:00
Till-JS
00dadc97d1 docs(todo): add task metadata reference documentation
Document all available task properties including scheduling, priority,
recurrence (RFC 5545 RRULE), subtasks, labels, and metadata fields.
Includes examples and notes on current QuickAdd implementation status.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 13:04:39 +01:00
Till-JS
b148a72e36 feat(referral): integrate referral system frontend
- Add referral code input to RegisterPage with live validation
- Create ReferralWidget for dashboard with stats, code sharing, and tier display
- Extend authService.signUp to accept optional referralCode parameter
- Add validateReferralCode function to authStore
- Create referrals.ts API service for frontend
- Add 'referral' widget type to dashboard configuration
- Fix drizzle.config.ts to include 'referrals' schema filter

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 13:01:43 +01:00
Till-JS
37039048f4 feat(todo): redesign task input and items with glass-pill style
- QuickAddTask: Add glass-morphism pill design with date, priority,
  and project pickers. Auto-focus on mount, fixed position on mobile
  above navigation bar with dropdowns opening upward
- TaskItem: Redesign with pill-shaped glass-morphism style, matching
  the navigation components. Includes hover effects, priority dot,
  and inline meta information
- TaskList: Remove redundant spacing since TaskItem has its own margin
- New tasks now default to today's date

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 13:00:29 +01:00
Till-JS
eb98f8949f fix(settings): complete global settings unification for remaining apps
- ManaDeck: Remove duplicate theme controls, add appId="manadeck"
- Contacts: Remove duplicate theme controls, add appId="contacts"
- Clock: Add userSettings.load() in onMount for server sync

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 12:45:10 +01:00
Till-JS
fb76cdc63d fix(settings): unify global settings across all web apps
- Replace custom settings implementations with GlobalSettingsSection
- Add appId prop to all GlobalSettingsSection instances
- Remove duplicate local theme/language controls
- Standardize settings across Chat, Picture, and Manacore apps

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 12:37:49 +01:00
Till-JS
241dc6173e Merge branch 'dev' of https://github.com/Memo-2023/manacore-monorepo into dev 2025-12-09 12:27:57 +01:00
Wuesteon
8af01724d7 feat(db): add production-safe migration system with advisory locks
- Add migrate.ts script with PostgreSQL advisory locks to prevent concurrent migrations
- Add retry logic with exponential backoff for transient connection errors
- Update CI/CD workflows to run migrations before deployment with health polling
- Create comprehensive DATABASE_MIGRATIONS.md documentation covering:
  - Drizzle ORM internals (push vs generate/migrate modes)
  - Migration tracking (journal files, __drizzle_migrations table)
  - Advisory lock architecture and timeout handling
  - Zero-downtime migration patterns (expand-contract)
  - Troubleshooting guide
- Update .claude/guidelines/database.md with migration quick reference
- Remove stale migration files that caused schema conflicts
2025-12-09 02:13:11 +01:00
Wuesteon
18a7b2d9a0 docs: add setup templates and checklists for recurring tasks
Create SETUP_TEMPLATES.md with copy-paste templates for:
- New SvelteKit web apps (hooks.server.ts, getAuthUrl pattern, Dockerfile)
- New NestJS backends (schema, health, CORS)
- Staging deployments (database creation, tag formats)
- Adding backends to ManaCore dashboard
- Port assignment reference

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-09 01:00:02 +01:00
Wuesteon
d074e6d2e5 docs: comprehensive staging deployment troubleshooting guide
Add extensive documentation for staging deployment issues:
- Lazy client initialization pattern for runtime URLs
- PostgreSQL ALTER TABLE USING clause requirement
- Debugging checklist for common issues (API, CORS, 500, 401)
- Summary table of common mistakes and prevention

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 23:11:01 +01:00
Wuesteon
81a2970e6c docs: add tag naming convention for mana-core-auth
Add documentation explaining the correct tag format for mana-core-auth
deployments. Using `auth-staging-*` instead of `mana-core-auth-staging-*`
causes the CD workflow to fail.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 23:02:40 +01:00
Wuesteon
6db875355c debug(auth): add detailed logging to JwtAuthGuard
Add console.log statements to JwtAuthGuard to diagnose
401 errors on /api/v1/settings endpoint.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 22:52:59 +01:00
Wuesteon
66bc3e9586 docs: add staging deployment issues troubleshooting guide
Documents common issues encountered during staging deployments:
- Runtime env injection for SvelteKit (import.meta.env vs window)
- CORS configuration for cross-app API calls
- CD workflow version tag handling
- Database creation for new backends
- Better Auth user ID format (text vs uuid)

Includes quick debugging commands and port reference.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 22:43:53 +01:00
Wuesteon
a50e4e5026 fix(staging): add manacore-web origin to backend CORS configs
Allow manacore-web (port 5173) to call todo-backend, calendar-backend,
and clock-backend APIs by adding it to their CORS_ORIGINS.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 22:27:34 +01:00
Wuesteon
4398fbc29b fix(manacore-web,todo-web): use runtime URLs for backend API services
- manacore-web: Update todo, calendar, contacts service files to use
  runtime URLs from window instead of import.meta.env (baked at build time)
- manacore-web: Add backend URL env vars to docker-compose.staging.yml
- manacore-web: Fix fallback ports (todo: 3017→3018, calendar: 3014→3016)
- todo-web: Update API client to use runtime URL from window

This enables Docker containers to use runtime-injected URLs instead of
build-time environment variables.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 22:03:12 +01:00
Wuesteon
7caeea4abd fix(manacore-web): add runtime env injection for auth URLs
Same fix as todo, calendar, clock - uses hooks.server.ts to inject
PUBLIC_MANA_CORE_AUTH_URL_CLIENT at runtime for Docker deployments.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 21:47:02 +01:00
Wuesteon
e02e2b37b1 fix(staging): add all web app origins to mana-core-auth CORS
Added CORS origins for all staging web apps:
- manacore-web: 5173
- calendar-web: 5186
- clock-web: 5187
- todo-web: 5188

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 21:28:06 +01:00
Wuesteon
c96820daf7 fix(ci): pass version tags to docker-compose via .env file
The CD workflow was pulling the correct versioned image but docker-compose
was using the default 'latest' tag because version variables weren't being
set. Now the workflow:

1. Computes the correct version variable name (e.g., TODO_WEB_VERSION)
2. Updates the .env file on the staging server with the version
3. docker-compose reads from .env and uses the correct image tag
4. Verifies the correct image is running after deployment

This fixes deployments where the container would keep running an old
image even after a new version was pushed.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 21:23:36 +01:00
Wuesteon
7f7b8b6db0 docs: add SvelteKit runtime env injection guidelines and troubleshooting
- Add comprehensive guide in .claude/guidelines/sveltekit-web.md about
  build-time vs runtime environment variables for Docker deployments
- Document the correct hooks.server.ts + window injection pattern
- Add Problem 9 to TROUBLESHOOTING.md for hardcoded localhost URLs
- List which apps are fixed vs need fixing
- Add checklist for fixing new apps

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 20:54:13 +01:00
Wuesteon
3d717eb16a fix(web): add runtime env injection for auth URLs in todo, calendar, clock
All three apps were hardcoding localhost:3001 for auth, which broke
staging deployments. Now uses hooks.server.ts to inject the correct
PUBLIC_MANA_CORE_AUTH_URL_CLIENT at runtime (same pattern as chat-web).

Changes:
- Add hooks.server.ts to todo, calendar, clock web apps
- Update auth.svelte.ts to use window.__PUBLIC_MANA_CORE_AUTH_URL__
- Update user-settings.svelte.ts to use runtime URL
- Fix feedback services to use runtime URL

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 20:49:39 +01:00
Wuesteon
828b6d71a1 docs: add pnpm Docker symlinks troubleshooting guide
Documented the "Cannot find package" error that occurs when pnpm symlinks
break in Docker containers due to directory structure changes.

Includes:
- Root cause explanation (symlinks point to .pnpm store)
- Wrong approach (flattening directory structure)
- Correct approach (preserve structure + copy .pnpm store)
- Debug commands
- Trade-offs (image size vs functionality)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 19:51:14 +01:00
Wuesteon
fd1c0ee6a2 fix(docker): preserve pnpm symlink structure in web Dockerfiles
The production stage was copying node_modules to /app, but pnpm creates
symlinks pointing to ../../../../../node_modules/.pnpm/ (relative to the
app's node_modules location). When the directory structure changed, these
symlinks broke, causing "Cannot find package" errors.

Fix:
- Keep same directory structure in production (/app/apps/*/apps/web)
- Copy the root .pnpm store that symlinks point to
- Copy the app's node_modules which contains the symlinks

Affected apps: todo, manacore, chat, calendar, clock

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 19:38:49 +01:00
Wuesteon
75d9d18e0d fix(web): copy node_modules from builder instead of npm install
npm doesn't understand pnpm's workspace:* protocol. Copy node_modules
from the builder stage to get all dependencies including workspace packages.

Affected: todo, manacore, chat, calendar, clock web apps.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 19:24:52 +01:00
Wuesteon
ef44c065f9 fix(web): remove silent npm install failures in all web Dockerfiles
The production stage was silently ignoring npm install failures with
`|| true`, causing dependencies to be missing at runtime.

Affected: clock, manacore, chat, calendar web apps.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 18:59:08 +01:00
Wuesteon
17c4932fc5 fix(todo-web): remove silent npm install failure in Dockerfile
The production stage was silently ignoring npm install failures with
`|| true`, causing date-fns and other dependencies to be missing at runtime.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 18:58:31 +01:00
Wuesteon
aa8cbb1662 fix(ci): correct health check path for backend deployments
The health check was using /health but all NestJS backends set
app.setGlobalPrefix('api/v1'), so the actual endpoint is /api/v1/health.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 18:41:45 +01:00
Wuesteon
3485bf0873 fix(ci): use GITHUB_TOKEN for GHCR auth on staging server
Match the working pattern from cd-staging.yml instead of requiring
a separate GHCR_PAT secret. GITHUB_TOKEN is automatically available
in GitHub Actions and has the necessary permissions for ghcr.io.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 18:16:11 +01:00
Wuesteon
73dfe57664 🔧 fix: add GHCR authentication for staging server
The staging server needs to authenticate to ghcr.io to pull private images.
Added docker login step using GHCR_PAT secret before deployment.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 18:13:17 +01:00
Wuesteon
59ce92af1a 🔧 fix: deployment workflow - lowercase image prefix, service names, and port fixes
- Fix Docker image prefix to lowercase (memo-2023) for Docker compatibility
- Keep service names with hyphens to match docker-compose.staging.yml
- Add step to sync docker-compose.staging.yml to server before deploy
- Fix calendar port to 3016/5186 to match staging compose

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 17:54:40 +01:00