[2026-05-16] psychologist-app: dev-setup.md

This commit is contained in:
Alexey Martemyanov
2026-05-16 02:46:23 +06:00
parent e7c1c8bcbf
commit 6f355f3b2c
12 changed files with 5284 additions and 18 deletions
@@ -0,0 +1,152 @@
---
created: '2026-05-16'
updated: '2026-05-16'
tags:
- project
- dev
- ios
- swift
---
# Reflect App — Dev Setup & Architecture
> Путь: `~/Developer/reflect-app/`
> Статус: BUILD SUCCEEDED, 30/30 тестов
---
## Структура проекта
```
reflect-app/
├── project.yml ← XcodeGen spec (генерирует .xcodeproj)
├── proxy_server.py ← Local AI proxy server (Mac → iPhone)
├── ReflectApp/
│ ├── Models/
│ │ ├── CrisisKeywords.swift
│ │ ├── Message.swift
│ │ ├── Session.swift
│ │ └── UserProfile.swift
│ ├── Services/
│ │ ├── ClaudeService.swift ← AI бэкенд (cloud + local proxy)
│ │ ├── AnalystBot.swift ← Бот 2 (Sonnet, CBT вопросы)
│ │ ├── NarratorBot.swift ← Бот 1 (Haiku, 3rd-person reframe)
│ │ ├── CrisisDetector.swift ← Hardcoded SI/SH детекция (RU+EN)
│ │ ├── ProfileManager.swift ← Obsidian-like on-device vault
│ │ └── SessionScheduler.swift ← Напоминания (UNUserNotificationCenter)
│ ├── Views/
│ │ ├── OnboardingView.swift ← 3 слайда + 5 вопросов + инсайт
│ │ ├── HomeView.swift
│ │ ├── SessionView.swift
│ │ ├── CrisisView.swift
│ │ ├── ProfileView.swift ← Obsidian-like markdown viewer
│ │ ├── SettingsView.swift ← Выбор бэкенда + API key + server URL
│ │ ├── CardView.swift
│ │ └── OrbCharacter.swift ← SwiftUI анимированный орб
│ └── ViewModels/
│ ├── HomeViewModel.swift
│ └── SessionViewModel.swift
└── ReflectAppTests/
└── ReflectAppTests.swift ← 30 тестов
```
---
## Генерация проекта
```bash
# Установить XcodeGen (один раз)
brew install xcodegen
# Регенерировать .xcodeproj после изменения project.yml
cd ~/Developer/reflect-app
xcodegen generate
```
---
## Сборка и тесты
```bash
# Узнать ID симулятора
xcrun simctl list devices | grep "iPhone 16 Pro"
# Сборка
xcodebuild -project ReflectApp.xcodeproj -scheme ReflectApp \
-destination "id=9FF2D6A8-E0DF-4157-9FA5-463E45BB5FAD" build
# Тесты (30 тестов, ~0.1 сек)
xcodebuild test -project ReflectApp.xcodeproj -scheme ReflectApp \
-destination "id=9FF2D6A8-E0DF-4157-9FA5-463E45BB5FAD"
```
---
## Локальный AI сервер (режим без ключа)
### Запуск (Ollama — локальная модель)
```bash
# Сервер слушает на всех интерфейсах, показывает LAN IP
cd ~/Developer/reflect-app
python3 proxy_server.py --backend ollama --ollama-model qwen2.5:7b
# Или с Claude API
export ANTHROPIC_API_KEY=sk-ant-...
python3 proxy_server.py --backend claude
```
### Настройка на iPhone
1. Открыть приложение → шестерёнка (Settings)
2. AI Backend → "Локальный сервер (Mac)"
3. URL сервера: скопировать из вывода `proxy_server.py`
4. Нажать "Проверить" — должно показать "Доступен · qwen2.5:7b"
### Архитектура proxy
```
iPhone (ClaudeService)
→ POST /v1/messages → proxy_server.py (8765)
→ Anthropic API format → Ollama (11434)
← response ← Ollama response (конвертируется в Anthropic формат)
← response ← proxy_server.py
```
---
## Архитектура двойного бота
```
User input (1-е лицо)
CrisisDetector.detect() — hardcoded, <5ms
↓ (если .critical → CrisisView)
NarratorBot (Haiku) — переформулировка в 3-е лицо
AnalystBot (Sonnet) — читает profile.md + вопросы
CardView с вопросами
```
---
## On-device хранилище (Obsidian-like)
```
Documents/UserProfile/
├── profile.md ← паттерны, наблюдения, прогресс
├── insights.md ← кристаллизованные инсайты
└── sessions/
├── 2026-05-16.md
└── ...
```
---
## Тест-результаты (2026-05-16)
- ClaudeServiceTests: 4/4
- CrisisDetectorTests: 17/17 (включая RU+EN, нормализация)
- ProfileManagerTests: 6/6 (включая onboarding init)
- SessionSchedulerTests: 3/3
- **ИТОГО: 30/30, 0 failures**