Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,7 @@
## 2024-07-01 - [Interactive CBT Exercises & Granular Community Metrics]
**Инсайт:** Добавление динамически триггерируемых упражнений в AI-Коуче ('Letter to Craving' и 'HALT Analysis') повышает вовлеченность пользователей в моменты острой тяги. Использование специализированных методов статистики для благодарностей в `CommunityService` ускоряет получение реакций без повторных тяжелых пересчетов.
**Действие:** Всегда пополнять интерактивные шаблоны ассистента специализированными техниками с пошаговыми инструкциями и покрывать их автоматическими тестами.

## 2026-08-18 - [Somatic Grounding & Anxiety Exercise Triggers]
**Инсайт:** Интеграция быстрых антипанических упражнений с ключевыми словами острой тревоги ('паника', 'тревожность', 'паническая атака') позволяет ассистенту мгновенно предложить соматический протокол саморегуляции вместо абстрактного ответа.
**Действие:** Всегда снабжать новые триггеры ассистента пошаговыми интерактивными инструкциями с реальной физиологической поддержкой и покрывать их юнит-тестами.
27 changes: 27 additions & 0 deletions RELEASE_NOTES_v1.24.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Sober Path — Release Notes v1.24.0 ⚡

**Дата релиза:** 18 августа 2026 г.
**Версия:** 1.24.0 (Build 24)

---

## 🤖 AI-Коуч и Встроенные Упражнения
- **Новое CBT-упражнение "Преодоление тревоги и паники" (`anxiety_management`):** Пошаговый алгоритм физиологического и когнитивного заземления при острых приступах тревоги.
- **Интеллектуальные триггеры коуча:** Автоматическое обнаружение ключевых слов ('паника', 'паническая атака', 'тревожность', 'паникую', 'острая тревога') с мгновенной предложенной помощью.

## 📚 Контент и Обучение
- **Новый микро-курс "Управление тревогой и паникой" (`anxiety_and_panic_control`):** 3 структурированных урока с соматическими практиками, дыханием и проверочным тестом.
- **5 новых экспертных статей (IDs 103–107):**
- ID 103: *Нейробиология панической атаки: как восстановить контроль за 3 минуты*
- ID 104: *Соматическое заземление: телесные практики при тревожных расстройствах*
- ID 105: *Преодоление токсичного стыда и чувства вины в выздоровлении*
- ID 106: *Как распознать и нейтрализовать скрытые триггеры тревожности*
- ID 107: *Техники когнитивной дефузии: работа с навязчивыми мыслями*

## 💬 Сообщество и Социальная Поддержка
- **Стикеры поддержки сообщества:** Реализован инструмент отправки виртуальных стикеров поддержки ("Обнимаю", "Горжусь тобой", "Так держать!", "Я рядом") с начислением +15 очков Кармы.

## 🛠 Надежность и Автотесты
- Добавлены модульные тесты `__tests__/Cycle24Features.test.ts` (100% успеваемость, 57 пройденных тестов).
- Нулевые ошибки компиляции `npx tsc --noEmit`.
- Верификация приложения с генерацией графического снимка `assets/screenshots/cycle24_verification.png`.
18 changes: 18 additions & 0 deletions TASKS.md
Original file line number Diff line number Diff line change
Expand Up @@ -391,3 +391,21 @@
- [x] Написать модульные тесты `__tests__/Cycle23Features.test.ts` (100% прохождение всех 51 тестов).
- [x] Выполнить экспортируемый верификационный билдинг для Web платформы и обновить скриншот.
- [x] Подготовить релиз v1.23.0.

# Список задач по улучшению приложения (Цикл 24) - ВЫПОЛНЕНО ⚡

## 🤖 AI-Коуч и Встроенные Упражнения
- [x] Разработать пошаговую CBT-технику "Преодоление тревоги и паники" (`anxiety_management`) для купирования приступов острой тревожности.
- [x] Настроить триггеры ключевых слов ('паника', 'паническая атака', 'тревожность', 'паникую', 'острая тревога') в `AICoachService.ts`.

## 📚 Контент и Обучение
- [x] Создать новый практический микро-курс "Управление тревогой и паникой" (`anxiety_and_panic_control`) из 3 уроков с проверочным квизом.
- [x] Пополнить Базу Знаний 5 специализированными статьями (ID 103–107) про нейробиологию панической атаки, соматическое заземление, стыд и когнитивную дефузию.

## 💬 Сообщество и Поддержка
- [x] Реализовать стикеры поддержки в `CommunityService` (`getSupportStickers()`, `sendSupportSticker()`) с вознаграждением +15 очков Кармы.

## 🛠 Тестирование и Подготовка Релиза
- [x] Написать автоматические тесты `__tests__/Cycle24Features.test.ts` (100% прохождение 57 тестов).
- [x] Выполнить экспортируемый верификационный билдинг для Web платформы и сохранить скриншот `assets/screenshots/cycle24_verification.png`.
- [x] Обновить версии до `1.24.0` и подготовить релиз v1.24.0.
77 changes: 77 additions & 0 deletions __tests__/Cycle24Features.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { getAllArticles, getArticleById } from '../services/articlesDatabase';
import { MicroCoursesService } from '../services/microCoursesService';
import { microCoursesDatabase } from '../services/microCoursesDatabase';
import { AICoachService } from '../services/AICoachService';
import { CommunityService } from '../services/communityService';

describe('Cycle 24 Features Tests', () => {
describe('Content & Educational Materials', () => {
test('micro-course anxiety_and_panic_control exists in microCoursesDatabase', () => {
const course = microCoursesDatabase.find(c => c.id === 'anxiety_and_panic_control');
expect(course).toBeDefined();
expect(course?.title).toBe('Управление тревогой и паникой');
expect(course?.lessons.length).toBe(3);
});

test('micro-course anxiety_and_panic_control exists in MicroCoursesService with quiz', () => {
const course = MicroCoursesService.getCourseById('anxiety_and_panic_control');
expect(course).toBeDefined();
expect(course?.category).toBe('psychology');
expect(course?.quiz).toBeDefined();
expect(course?.quiz?.length).toBeGreaterThan(0);
});

test('new articles 103 to 107 exist in articlesDatabase', () => {
const allArticles = getAllArticles();
const article103 = getArticleById('article-103');
const article104 = getArticleById('article-104');
const article105 = getArticleById('article-105');
const article106 = getArticleById('article-106');
const article107 = getArticleById('article-107');

expect(allArticles.length).toBeGreaterThanOrEqual(107);
expect(article103).toBeDefined();
expect(article103?.title).toContain('Нейробиология панической атаки');
expect(article104?.title).toContain('Соматическое заземление');
expect(article105?.title).toContain('Преодоление токсичного стыда');
expect(article106?.title).toContain('скрытые триггеры тревожности');
expect(article107?.title).toContain('Техники когнитивной дефузии');
});
});

describe('AI Coach Anxiety & Panic Exercise Trigger', () => {
test('triggers anxiety_management exercise when user mentions panic keywords', async () => {
const defaultContext = {
userMood: 3,
soberDays: 10,
cravingLevel: 2,
timeOfDay: 'afternoon' as const
};
const response = await AICoachService.getEnhancedResponse('user_24', 'У меня сильная паника и тревожность, помоги', defaultContext);
expect(response.success).toBe(true);
if (response.success) {
expect(response.data.exercise).toBeDefined();
expect(response.data.exercise?.id).toBe('anxiety_management');
expect(response.data.exercise?.name).toBe('Преодоление тревоги и паники');
expect(response.data.exercise?.steps.length).toBeGreaterThan(3);
}
});
});

describe('Community Support Stickers', () => {
test('getSupportStickers returns list of stickers', () => {
const stickers = CommunityService.getSupportStickers();
expect(stickers.length).toBeGreaterThanOrEqual(4);
expect(stickers[0]).toHaveProperty('id');
expect(stickers[0]).toHaveProperty('name');
expect(stickers[0]).toHaveProperty('karmaReward');
});

test('sendSupportSticker awards +15 Karma points', async () => {
const initialKarma = await CommunityService.getUserKarma();
const result = await CommunityService.sendSupportSticker('hug', 'Алексей');
expect(result.success).toBe(true);
expect(result.newKarma).toBe(initialKarma + 15);
});
});
});
2 changes: 1 addition & 1 deletion app.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"expo": {
"name": "Sober Path",
"slug": "sober-path",
"version": "1.23.0",
"version": "1.24.0",
"orientation": "portrait",
"icon": "./assets/images/logo.png",
"scheme": "soberpath",
Expand Down
Binary file added assets/screenshots/cycle24_verification.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "sober-path",
"main": "expo-router/entry",
"version": "1.23.0",
"version": "1.24.0",
"scripts": {
"start": "expo start",
"reset-project": "node ./scripts/reset-project.js",
Expand Down
28 changes: 28 additions & 0 deletions serve.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
npm warn exec The following package was not found and will be installed: serve@14.2.6
INFO Accepting connections at http://localhost:3000
HTTP 8/18/2026 8:59:02 PM ::1 HEAD /
HTTP 8/18/2026 8:59:02 PM ::1 Returned 200 in 20 ms
HTTP 8/18/2026 9:00:18 PM ::1 GET /
HTTP 8/18/2026 9:00:18 PM ::1 Returned 200 in 10 ms
HTTP 8/18/2026 9:00:18 PM ::1 GET /_expo/static/js/web/entry-69da561d41ea915c1653bc223d705781.js
HTTP 8/18/2026 9:00:18 PM ::1 Returned 200 in 28 ms
HTTP 8/18/2026 9:00:19 PM ::1 GET /assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/MaterialIcons.4e85bc9ebe07e0340c9c4fc2f6c38908.ttf
HTTP 8/18/2026 9:00:19 PM ::1 Returned 200 in 5 ms
HTTP 8/18/2026 9:00:22 PM ::1 GET /courses
HTTP 8/18/2026 9:00:22 PM ::1 Returned 200 in 2 ms
HTTP 8/18/2026 9:00:22 PM ::1 GET /_expo/static/js/web/entry-69da561d41ea915c1653bc223d705781.js
HTTP 8/18/2026 9:00:22 PM ::1 Returned 304 in 1 ms
HTTP 8/18/2026 9:00:22 PM ::1 GET /assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/MaterialIcons.4e85bc9ebe07e0340c9c4fc2f6c38908.ttf
HTTP 8/18/2026 9:00:22 PM ::1 Returned 304 in 2 ms
HTTP 8/18/2026 9:00:24 PM ::1 GET /ai-coach
HTTP 8/18/2026 9:00:24 PM ::1 Returned 200 in 1 ms
HTTP 8/18/2026 9:00:24 PM ::1 GET /_expo/static/js/web/entry-69da561d41ea915c1653bc223d705781.js
HTTP 8/18/2026 9:00:24 PM ::1 Returned 304 in 3 ms
HTTP 8/18/2026 9:00:24 PM ::1 GET /assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/MaterialIcons.4e85bc9ebe07e0340c9c4fc2f6c38908.ttf
HTTP 8/18/2026 9:00:24 PM ::1 Returned 304 in 1 ms
HTTP 8/18/2026 9:00:27 PM ::1 GET /community
HTTP 8/18/2026 9:00:27 PM ::1 Returned 200 in 1 ms
HTTP 8/18/2026 9:00:27 PM ::1 GET /_expo/static/js/web/entry-69da561d41ea915c1653bc223d705781.js
HTTP 8/18/2026 9:00:27 PM ::1 Returned 304 in 1 ms
HTTP 8/18/2026 9:00:27 PM ::1 GET /assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/MaterialIcons.4e85bc9ebe07e0340c9c4fc2f6c38908.ttf
HTTP 8/18/2026 9:00:27 PM ::1 Returned 304 in 1 ms
24 changes: 24 additions & 0 deletions services/AICoachService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,30 @@ export class AICoachService {
const sentiment = this.detectSentiment(userMessage);

// Проверка на запрос упражнения
if (lowercaseMessage.includes('паника') || lowercaseMessage.includes('паническая атака') || lowercaseMessage.includes('тревожность') || lowercaseMessage.includes('паникую') || lowercaseMessage.includes('острая тревога')) {
return success({
message: 'Паника и острая тревога — это кратковременный всплеск адреналина. Ваше тело в безопасности. Давайте применим пошаговый протокол саморегуляции для быстрого снятия приступа!',
emotionalTone: 'supportive',
suggestions: ['Начать снятие паники', 'Не сейчас'],
followUpQuestions: [],
memoryUpdates: ['User requested anxiety and panic control exercise'],
confidenceLevel: 1.0,
exercise: {
id: 'anxiety_management',
name: 'Преодоление тревоги и паники',
type: 'grounding',
currentStep: -1,
steps: [
'Сделайте глубокий медленный вдох носом на 4 секунды и выдохните через рот на 8 секунд. Почувствуйте, как сердце замедляется.',
'Ощутите стопами надежную опору на полу. Вспомните: этот выброс адреналина спадет уже через несколько минут.',
'Найдите вокруг себя 5 предметов синего или зеленого цвета. Фиксация на деталях возвращает контроль.',
'Скажите себе вслух или про себя: "Это просто адреналиновая волна. Я в полной безопасности, и это пройдет".',
'Положите руку на грудь, сделайте мягкий выдох и улыбнитесь себе за стойкость.'
]
}
});
}

if (lowercaseMessage.includes('мегаполис') || lowercaseMessage.includes('город') || lowercaseMessage.includes('шум') || lowercaseMessage.includes('детокс')) {
return success({
message: 'Стресс мегаполиса — частый триггер срыва. Давайте проведем сессию "Умного городского детокса", чтобы быстро сбросить напряжение и вернуть фокус. Начнем?',
Expand Down
Loading
Loading