managarten/services/matrix-clock-bot/CLAUDE.md
Till-JS c13c313886 🐛 fix(gifts): reorder controller routes to fix 'me/*' matching
NestJS matches routes in declaration order. The dynamic :code route was
matching before me/created and me/received, treating 'me' as a gift code.
Moved specific routes before the dynamic parameter route.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-14 12:38:23 +01:00

185 lines
4.8 KiB
Markdown

# Matrix Clock Bot - Claude Code Guidelines
## Overview
Matrix Clock Bot provides time tracking functionality via Matrix chat. Users can create timers, set alarms, and manage world clocks through text commands or voice notes.
## Tech Stack
- **Framework**: NestJS 10
- **Matrix**: matrix-bot-sdk
- **Backend**: Clock API (port 3017)
- **STT**: mana-stt service (port 3020)
## Commands
```bash
# Development
pnpm install
pnpm start:dev # Start with hot reload
# Build
pnpm build # Production build
# Type check
pnpm type-check # Check TypeScript types
```
## Project Structure
```
services/matrix-clock-bot/
├── src/
│ ├── main.ts # Application entry point (port 3317)
│ ├── app.module.ts # Root module
│ ├── config/
│ │ └── configuration.ts # Configuration & help messages
│ ├── bot/
│ │ ├── bot.module.ts
│ │ └── matrix.service.ts # Matrix client & command handlers
│ ├── clock/
│ │ ├── clock.module.ts
│ │ └── clock.service.ts # Clock API client
│ └── widget/
│ ├── widget.module.ts
│ └── widget.controller.ts # Timer widget for Element sidebar
├── Dockerfile
└── package.json
```
## Bot Commands
### Timer Commands
| Command | Description |
|---------|-------------|
| `!timer 25m` | Create & start 25-minute timer |
| `!timer 1h30m` | Create 1.5 hour timer |
| `!timer 25m Pomodoro` | Timer with label |
| `!stop` | Pause running timer |
| `!resume` | Resume paused timer |
| `!reset` | Reset timer to start |
| `!status` | Show current timer status |
| `!timers` | List all timers |
| `!widget` | Add timer widget to room sidebar |
### Alarm Commands
| Command | Description |
|---------|-------------|
| `!alarm 07:30` | Set alarm for 7:30 |
| `!alarm 7 Uhr 30` | German time format |
| `!alarm 06:00 Aufstehen!` | Alarm with label |
| `!alarms` | List all alarms |
### World Clock Commands
| Command | Description |
|---------|-------------|
| `!zeit` / `!time` | Current time + world clocks |
| `!weltuhr Berlin` | Add world clock |
| `!weltuhren` | List world clocks |
### Natural Language & Voice
The bot understands natural language:
- "Timer 25 Minuten"
- "Wecker um 7 Uhr"
- "Stop"
- "Status"
Voice notes are transcribed and parsed as commands.
## Environment Variables
```env
# Server
PORT=3317
# Matrix
MATRIX_HOMESERVER_URL=http://localhost:8008
MATRIX_ACCESS_TOKEN=syt_xxx
MATRIX_ALLOWED_ROOMS=#clock:matrix.mana.how
MATRIX_STORAGE_PATH=./data/bot-storage.json
# Clock Backend API
CLOCK_API_URL=http://localhost:3017/api/v1
CLOCK_API_TOKEN=
# Speech-to-Text
STT_URL=http://localhost:3020
# Widget (public URL for embedding in Matrix clients)
WIDGET_PUBLIC_URL=http://localhost:3317/widget
```
## Clock API Endpoints Used
| Endpoint | Method | Description |
|----------|--------|-------------|
| `/timers` | GET | List all timers |
| `/timers` | POST | Create timer |
| `/timers/:id/start` | POST | Start timer |
| `/timers/:id/pause` | POST | Pause timer |
| `/timers/:id/reset` | POST | Reset timer |
| `/alarms` | GET | List alarms |
| `/alarms` | POST | Create alarm |
| `/alarms/:id/toggle` | PATCH | Toggle alarm |
| `/world-clocks` | GET | List world clocks |
| `/world-clocks` | POST | Add world clock |
| `/timezones/search` | GET | Search timezones (public) |
## Widget
The bot provides a timer widget that can be embedded in Matrix/Element rooms.
### Widget Endpoints
| Endpoint | Description |
|----------|-------------|
| `GET /widget` | HTML page with timer display |
| `GET /widget/api/status?userId=X` | Timer status JSON |
| `GET /widget/api/control?userId=X&action=Y` | Control timer (start/pause/reset) |
### Adding Widget
1. Use `!widget` command - bot adds widget automatically
2. Or manually: `/addwidget <WIDGET_PUBLIC_URL>`
### Widget Features
- Live timer progress bar with countdown
- Start/Pause/Reset controls
- Auto-refresh every 10 seconds with local countdown
- Dark theme matching Element
## Docker
```bash
# Build
docker build -f services/matrix-clock-bot/Dockerfile -t matrix-clock-bot services/matrix-clock-bot
# Run
docker run -p 3318:3318 \
-e MATRIX_HOMESERVER_URL=http://synapse:8008 \
-e MATRIX_ACCESS_TOKEN=syt_xxx \
-e CLOCK_API_URL=http://clock-backend:3017/api/v1 \
-e STT_URL=http://mana-stt:3020 \
-v matrix-clock-bot-data:/app/data \
matrix-clock-bot
```
## Health Check
```bash
curl http://localhost:3318/health
```
## Authentication
Currently uses a demo token (`CLOCK_API_TOKEN`) for development. Production should implement proper user authentication flow:
1. User sends `!login` command
2. Bot initiates OAuth/auth flow with mana-core-auth
3. User token stored per Matrix user ID
4. Token used for all Clock API calls