From 321505c0a00e1d2fcab267827bc2d0eb4ebefd45 Mon Sep 17 00:00:00 2001 From: Mikhail Kiselev Date: Tue, 10 Feb 2026 03:46:54 +0300 Subject: [PATCH] chore: remove copilot-instructions, fix dev port --- .github/copilot-instructions.md | 320 -------------------------------- Makefile | 4 +- 2 files changed, 2 insertions(+), 322 deletions(-) delete mode 100644 .github/copilot-instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md deleted file mode 100644 index e1a0823..0000000 --- a/.github/copilot-instructions.md +++ /dev/null @@ -1,320 +0,0 @@ -# Daily Timer - AI Assistant Instructions - -## Project Overview - -- **Purpose**: Desktop meeting timer application with speaker management -- **Framework**: Wails v2.11.0 (Go backend + Svelte frontend) -- **Status**: Active development - -## Technology Stack - -| Component | Technology | -| ------------- | --------------------------- | -| **Backend** | Go 1.21+ | -| **Framework** | Wails v2.11.0 | -| **Frontend** | Svelte 4 + Vite | -| **Database** | SQLite via GORM | -| **Audio** | Web Audio API (oscillators) | -| **Linter** | golangci-lint | - -## Project Structure - -``` -daily-timer/ -├── main.go # App entry point -├── wails.json # Wails configuration -├── internal/ -│ ├── app/ -│ │ └── app.go # Main App struct, Wails bindings -│ ├── models/ -│ │ └── models.go # Data models (Participant, Meeting, etc.) -│ ├── storage/ -│ │ └── storage.go # GORM database operations -│ └── timer/ -│ └── timer.go # Timer logic, event emission -├── frontend/ -│ ├── src/ -│ │ ├── App.svelte # Main component, event handlers -│ │ ├── components/ -│ │ │ ├── Timer.svelte -│ │ │ ├── ParticipantList.svelte -│ │ │ ├── Controls.svelte -│ │ │ ├── Settings.svelte -│ │ │ ├── History.svelte -│ │ │ └── Setup.svelte -│ │ └── lib/ -│ │ └── i18n.js # Translations (RU/EN) -│ └── wailsjs/ # Auto-generated Go bindings -└── build/ # Build output -``` - -## Critical Rules - MUST FOLLOW - -### 1. Wails Terminal Directory - -**ALWAYS run `wails dev` from project root**, not from subdirectories: - -```bash -# ✅ CORRECT -cd /Users/admin-msk/git/daily-timer && wails dev - -# ❌ WRONG - causes "wails.json not found" error -cd /Users/admin-msk/git/daily-timer/internal/timer && wails dev -``` - -### 2. TypeScript Model Casing - -Go structs use PascalCase, but Wails generates TypeScript with camelCase: - -```go -// Go model -type Session struct { - ID uint - StartTime time.Time -} -``` - -```typescript -// Generated TypeScript - use lowercase! -session.id; // ✅ CORRECT -session.ID; // ❌ WRONG - undefined -session.startTime; // ✅ CORRECT -session.StartTime; // ❌ WRONG - undefined -``` - -### 3. GORM Partial Updates - -**NEVER use `db.Save()` for partial updates** - it overwrites ALL fields with zero values: - -```go -// ❌ WRONG - overwrites Active, Order, etc. with zero values -func (s *Storage) UpdateParticipant(p *models.Participant) error { - return s.db.Save(p).Error -} - -// ✅ CORRECT - updates only specified fields -func (s *Storage) UpdateParticipant(p *models.Participant) error { - return s.db.Model(p).Updates(map[string]interface{}{ - "name": p.Name, - "email": p.Email, - "time_limit": p.TimeLimit, - }).Error -} -``` - -### 4. Timer Event Flags - -Use separate flags for different event types to prevent blocking: - -```go -// ❌ WRONG - one flag blocks both events -speakerWarned bool // After warning, timeup never fires - -// ✅ CORRECT - separate flags -speakerWarned bool // For warning event -speakerTimeUpEmitted bool // For timeup event -``` - -### 5. Sound in Wails (macOS) - -- Use Web Audio API oscillators, not audio files -- macOS "Do Not Disturb" mode blocks sounds -- Always add test buttons in Settings for verification - -```javascript -function playBeep(frequency, duration) { - const ctx = new AudioContext(); - const osc = ctx.createOscillator(); - const gain = ctx.createGain(); - osc.connect(gain); - gain.connect(ctx.destination); - osc.frequency.value = frequency; - gain.gain.setValueAtTime(0.3, ctx.currentTime); - gain.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + duration); - osc.start(); - osc.stop(ctx.currentTime + duration); -} -``` - -### 6. Svelte Event Dispatching - -When adding interactivity to list items: - -```svelte - - - - - -``` - -### 7. i18n Translations - -Always update BOTH languages (RU and EN) in `frontend/src/lib/i18n.js`: - -```javascript -translations: { - ru: { - history: { - deleteAll: 'Удалить историю', - } - }, - en: { - history: { - deleteAll: 'Delete History', - } - } -} -``` - -### 8. Go Linter (golangci-lint) - -Run before committing: - -```bash -/opt/homebrew/bin/golangci-lint run ./... -``` - -Common fixes: - -- Remove explicit types when inferring: `idx := -1` not `var idx int = -1` -- Remove unused functions -- Handle all error returns - -## Common Bugs & Solutions - -| Bug | Cause | Solution | -| ----------------------- | --------------------------- | ------------------------------------- | -| `wails.json not found` | Wrong directory | Run from project root | -| Data disappears on edit | `db.Save()` overwrites | Use `Updates(map[string]interface{})` | -| Event never fires | Shared flag blocks | Use separate flags per event | -| Sounds don't play | DND mode or no AudioContext | Add test buttons, check DND | -| `undefined` in template | Wrong case (ID vs id) | Check generated TS types | -| Drag-drop doesn't save | Missing backend call | Call `ReorderParticipants()` | -| "App is damaged" error | macOS Gatekeeper | Run `xattr -cr "Daily Timer.app"` | - -## Development Commands - -```bash -# Run in development mode (ALWAYS run manually from clean shell!) -cd /Users/admin-msk/git/daily-timer && wails dev - -# Build for production -wails build - -# Run linter -/opt/homebrew/bin/golangci-lint run ./... - -# Generate bindings (automatic in wails dev) -wails generate module -``` - -## Release Workflow - -### Building Release - -```bash -# Build and package for current architecture -make release - -# Build for all macOS architectures (arm64 + amd64) -make release-all -``` - -Output: `dist/Daily-Timer-vX.X.X-macos-arm64.zip` - -### Publishing Release to Gitea - -```bash -# Create and push tag -git tag -a v0.2.0 -m "Release description" -git push origin v0.2.0 - -# Build and upload to Gitea (requires GITEA_TOKEN) -GITEA_TOKEN=your_token make release-publish -``` - -### Rebuilding Existing Release - -If you need to rebuild a release (e.g., after fixing icon or bugs): - -```bash -# 1. Delete old dist folder -rm -rf dist - -# 2. Delete local and remote tag -git tag -d v0.1.0 -git push origin :refs/tags/v0.1.0 - -# 3. Delete old release on Gitea (get release ID from web UI or API) -curl -s -X DELETE \ - -H "Authorization: token $GITEA_TOKEN" \ - "https://git.movida.biz/api/v1/repos/bell/daily-timer/releases/RELEASE_ID" - -# 4. Create new tag -git tag -a v0.1.0 -m "Release description" -git push origin v0.1.0 - -# 5. Build and upload -GITEA_TOKEN=your_token make release-publish -``` - -### macOS Gatekeeper Fix - -**IMPORTANT**: Built app is not signed. macOS shows "app is damaged" error. - -Fix for users after downloading: - -```bash -xattr -cr "Daily Timer.app" -``` - -Or: Right-click → Open → Open (first launch only) - -For apps in /Applications: - -```bash -xattr -cr "/Applications/Daily Timer.app" -``` - -## Event System - -Timer emits events via Wails runtime: - -- `timer:tick` - Every 100ms during active timer -- `timer:speaker_warning` - When speaker time is running low -- `timer:speaker_timeup` - When speaker time expired -- `timer:meeting_warning` - When meeting time running low -- `timer:meeting_ended` - When meeting ends -- `timer:speaker_changed` - When switching speakers - -Frontend listens in App.svelte: - -```javascript -EventsOn('timer:speaker_warning', handleWarning); -``` - -## Debugging - -Open DevTools in Wails app: `Cmd+Option+I` - -Add console.log for event debugging: - -```javascript -function handleWarning(state) { - console.log('=== handleWarning EVENT RECEIVED ==='); - console.log('settings:', settings); - // ... -} -``` - ---- - -**Last Updated**: February 2026 diff --git a/Makefile b/Makefile index 31a745f..3d20097 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ .PHONY: dev build clean install frontend -# Development +# Development (fixed ports: Vite 5173, Wails DevServer 34115) dev: - wails dev + wails dev -devserver localhost:34115 # Build for macOS build: