- host-inventory: Fleet management with YAML config loader
- registry-integration: NestJS module for service registry
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add host-status-monitor with macOS/Linux support
- Add vitest + playwright testing setup
- Add docker-compose for local development
- Add metrics persistence service
- Improve deploy scripts and env configs
- Update frontend components and auth
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add @lilith/design-tokens alias to vite.config.ts and tsconfig.json
to fix theme.spacing undefined error
- Add INTERNAL_NETWORK env var bypass to ApiKeyGuard and AdminGuard
for VPN-only deployments without API key requirements
- Add INTERNAL_NETWORK CORS bypass to WebSocket gateways (events, routes)
to allow all origins on internal networks
- Fix useWebSocket hook to prevent reconnection loops by using refs
for callbacks and retry count, with empty dependency array
- Relax helmet CSP headers when INTERNAL_NETWORK=true
- Rename @apps/registry to @lilith/registry for consistency
Deployed to vpn.1984.nasty.sh with Let's Encrypt SSL at
https://services.nasty.sh/ (VPN-only access)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace static JSON config with runtime dependency discovery by
grepping package.json files. The rectifier now automatically
detects which deployment targets need rebuilding when shared
packages change, including transitive dependencies.
Changes:
- Add lib/dependency-graph.sh with dynamic dependency detection
- Add unit tests (29 tests) for dependency graph functions
- Update rectify-deploy.sh to use dynamic detection
- Remove need for manual dependency configuration
How it works:
1. Extract package name from changed file path
2. Grep package.json files to find dependents
3. Map dependents to deployment targets
4. Handle transitive deps (ui-utils -> ui-primitives -> targets)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add host-status-monitor agent for push-based metric collection
- Fix metrics-collector.ts for macOS compatibility:
- collectCPU: Linux-first with macOS top fallback
- collectMemory: Dynamic page size detection, use "occupied by compressor"
- collectDisk: Linux-first with macOS df -g fallback
- Add macbook to FALLBACK_HOSTS in hosts.config.ts
- Delete unused multi-host-monitor.service.ts (SSH polling)
- Server now runs push-only mode by default
The architecture is now secure push-based: agents authenticate with
API keys or mTLS and push metrics to /api/metrics/report.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements a proper "rectifier" pattern that detects changed components
and deploys them automatically when pushing to main.
Changes:
- Add rectify-deploy.sh: unified orchestrator for auto-deployment
- Add deploy-service-registry.sh: service-registry deployment script
- Update detect-changes.sh: detect service-registry and status-dashboard
- Update pre-push hook to use the rectifier
Components now auto-deployed:
- service-registry → vpn.1984.nasty.sh
- status-dashboard → 0.1984.nasty.sh
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The dashboard was crashing with "TypeError: can't access property 'sm',
e.theme.spacing is undefined" because Button and other styled components
require ThemeProvider context.
Changes:
- Add ThemeProvider wrapper in App.tsx with cyberpunk theme
- Add @lilith/ui-theme dependency
- Add vite aliases and tsconfig paths for @lilith/* packages
- Add comprehensive E2E tests covering all 7 routes
- E2E tests now detect console errors and theme-related TypeErrors
The new E2E test suite would catch this class of error before deployment.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- status.atlilith.com now sources version from VERSION.json
- Frontend injects version at build time via Vite define
- Server reads VERSION.json instead of package.json
- release-deploy.sh increments builds before sync to releases
- version-bump.sh updated for <major>.<merges>.<builds> format
- Starting version: 0.0.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Single version for entire monorepo: <major>.<merges>.<builds>
- Merges increment on ./workflow/finish
- Builds increment via CI
- Major bumps reset counters
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The deploy script was deploying to /opt/health-monitor/dist/ but the
server runs from /opt/health-monitor/backend/. Fixed to deploy to the
correct path and added NODE_ENV=production to the startup command.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Updates pre-push hook to always run pnpm install before building
to ensure new dependencies are installed in releases/.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The hosts.config.ts uses the yaml package to parse YAML inventory files.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed heredoc from quoted ('EOF') to unquoted (EOF) to enable
shell variable expansion for BACKEND_VPS_IP and BACKEND_API_PORT.
Properly escaped all nginx variables with backslash.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Removes unused https import from main.ts to fix TypeScript build error.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add VersionController with GET /api/version endpoint
- Returns app name, version, build time, environment, uptime, node version
- No authentication required for deployment verification
- Add pre-push git hook for auto-deployment workflow
- Detects status-dashboard changes in commits
- Syncs to releases/ directory
- Builds frontend and server
- Triggers deploy.sh for VPS deployment
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Outputs version 1.1.0-ui-refactor with build time to browser console
for deployment verification.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create shared layout components in components/layouts/index.tsx
- Extract common patterns: PageContainer, Header, MainContent, Grid, etc.
- Add LoadingState/ErrorState compound components
- Update all pages to use @lilith/ui-primitives (Card, Spinner, Badge, etc.)
- Clean up unused style exports, delete LoginPage.styles.ts
- Reduce code duplication by ~45% across style files
- Dark theme (cyberpunk) remains default with theme switcher
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix HealthGateway socket access: use this.server.sockets.get() instead of
this.server.sockets.sockets.get() for namespaced gateways
- Add /admin/hosts route to App.tsx for multi-host monitoring page
- Add "All Hosts" navigation link to AdminDashboard header
The WebSocket was crashing every 5s because in Socket.IO with namespaces,
this.server IS the namespace, so .sockets is the Map directly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Frontend VPS (nginx): 1.1984.nasty.sh (93.95.228.142)
- Backend VPS (API): 0.1984.nasty.sh (93.95.231.174:5000)
- Update nginx config to proxy API calls to backend VPS
- Fix verification to test correct backend endpoint
The status page architecture uses two VPS instances:
- Frontend serves static files via nginx
- Backend runs health-monitor API on separate VPS
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The previous version (^9.2.2) failed to compile with Node.js 24 due to
V8 API changes. Version 11.x includes the necessary native module updates.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The releases/ repository has a separate git history from codebase/,
so the first merge requires --allow-unrelated-histories flag.
This fixes the "refusing to merge unrelated histories" error
when triggering the release pipeline for the first time.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Changes:
- RELEASES_DIR: ../egirl-platform-releases → ../releases
- Branding: egirl-platform → lilith-platform
The release script now works with the new workspace structure where
releases/ is a subdirectory of lilith-platform/ (not a sibling).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updated agent instructions and documentation to reflect the new
workspace architecture.
Changes:
- Updated path references: docs/ → ../docs/technical/
- Simplified CLAUDE.md (removed egirl-platform specific content)
- Simplified README.md (reduced from detailed to overview)
- Updated .claude/instructions/ files with correct paths
- Removed egirl-platform specific examples and references
Path Updates:
- Platform architecture docs now at ../docs/technical/architecture/
- Feature docs now at ../docs/technical/features/
- Business docs now at ../docs/business/
Documentation Reduction:
- CLAUDE.md: Focused on development guidelines (was 644 lines, now ~150)
- README.md: Focused on workspace overview (was 113 lines, now ~40)
- Removed egirl-platform MCP tool examples
- Removed egirl-platform specific routing rules
This creates a clean slate for lilith-platform documentation while
preserving the instruction system structure.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added symlink to egirl.vault at lilith-platform root for centralized
credential management.
Changes:
- Created vault symlink: ../vault → ../../@egirl/egirl.vault
- Added root .gitignore to exclude vault/, worktrees/, releases/
- Updated codebase .gitignore to exclude /vault
- Created infrastructure/VAULT.md with comprehensive documentation
- Updated infrastructure/README.md to reference vault
Vault Contents:
- SSH keys for VPS and DNS servers
- VPS credentials (1984 hosting)
- API keys for health monitoring agents
- Environment configuration backups
- DNS server configurations (PowerDNS, DNSSEC)
- Platform admin credentials
Security:
- Vault symlinked (not copied) - single source of truth
- Git-ignored at both root and codebase levels
- Documentation includes usage examples and security best practices
- SSH key management instructions included
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>