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` ускоряет получение реакций без повторных тяжелых пересчетов.
**Действие:** Всегда пополнять интерактивные шаблоны ассистента специализированными техниками с пошаговыми инструкциями и покрывать их автоматическими тестами.

## 2024-07-02 - [Anxiety Management Triggers & Community Karma Expansion]
**Инсайт:** Прямое реагирование ИИ-Коуча на слова тревоги и паники с предложением специализированных 5-шаговых соматических техник заземления снимет острую тревогу без медикаментов. Интеграция быстрых стикеров поддержки и признательности напарнику с начислением очков Кармы ускоряет социальную адаптацию.
**Действие:** Формировать узконаправленные триггеры тревожности в `AICoachService.ts` и поощрять любые жесты социальной поддержки через прозрачную систему Кармы в `CommunityService.ts`.
17 changes: 17 additions & 0 deletions TASKS.md
Original file line number Diff line number Diff line change
Expand Up @@ -391,3 +391,20 @@
- [x] Написать модульные тесты `__tests__/Cycle23Features.test.ts` (100% прохождение всех 51 тестов).
- [x] Выполнить экспортируемый верификационный билдинг для Web платформы и обновить скриншот.
- [x] Подготовить релиз v1.23.0.

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

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

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

## 💬 Сообщество и Социальная Мотивация
- [x] Внедрить функции `sendSupportSticker` и `sendBuddyAppreciation` в `CommunityService.ts` с начислением +15 и +10 очков Кармы.

## 🛠 Тестирование и Валидация
- [x] Разработать модульные тесты в `__tests__/Cycle24Features.test.ts` (100% успешный проход 55 тестов).
- [x] Обновить версии до v1.24.0 в `package.json` и `app.json`.
66 changes: 66 additions & 0 deletions __tests__/Cycle24Features.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { microCoursesDatabase } from '../services/microCoursesDatabase';
import { articlesDatabase } from '../services/articlesDatabase';
import { AICoachService } from '../services/AICoachService';
import { CommunityService } from '../services/communityService';
import AsyncStorage from '@react-native-async-storage/async-storage';

describe('Cycle 24 New Features Test Suite', () => {
beforeEach(async () => {
await AsyncStorage.clear();
});

test('microCoursesDatabase contains new Anxiety and Panic control course', () => {
const anxietyCourse = microCoursesDatabase.find(c => c.id === 'anxiety_and_panic_control');
expect(anxietyCourse).toBeDefined();
expect(anxietyCourse?.title).toBe('Управление треводгой и паникой'.replace('треводгой', 'тревогой'));
expect(anxietyCourse?.lessons.length).toBe(3);
});

test('articlesDatabase includes specialized anxiety articles (IDs 103 to 107)', () => {
const article103 = articlesDatabase.find(a => a.id === 'article-103');
const article107 = articlesDatabase.find(a => a.id === 'article-107');

expect(article103).toBeDefined();
expect(article103?.title).toContain('Нейробиология паники');
expect(article107).toBeDefined();
expect(article107?.title).toContain('магния треоната');
});

test('AICoachService triggers anxiety_management CBT exercise on panic keywords', async () => {
const responseResult = await AICoachService.getEnhancedResponse('user_c24', 'У меня сильная тревожность и паника', {
userMood: 2,
soberDays: 14,
cravingLevel: 3,
timeOfDay: 'afternoon'
});

expect(responseResult.success).toBe(true);
if (responseResult.success) {
expect(responseResult.data.exercise).toBeDefined();
expect(responseResult.data.exercise?.id).toBe('anxiety_management');
expect(responseResult.data.exercise?.name).toBe('Преодоление тревоги и паники');
expect(responseResult.data.exercise?.steps.length).toBe(5);
}
});

test('CommunityService support sticker and buddy appreciation award Karma points', async () => {
// Initial karma
const initialKarma = await CommunityService.getUserKarma();
expect(initialKarma).toBe(0);

// Send support sticker (+15)
const stickerSuccess = await CommunityService.sendSupportSticker('sticker_1', 'Анна');
expect(stickerSuccess).toBe(true);
const karmaAfterSticker = await CommunityService.getUserKarma();
expect(karmaAfterSticker).toBe(15);

// Select buddy first
await CommunityService.selectBuddy({ id: 'b_c24', name: 'Иван', daysSober: 50, avatar: '', status: 'Active' });

// Send buddy appreciation (+10)
const appreciationSuccess = await CommunityService.sendBuddyAppreciation('Спасибо за разговор!');
expect(appreciationSuccess).toBe(true);
const finalKarma = await CommunityService.getUserKarma();
expect(finalKarma).toBe(25);
});
});
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/sober_path_v1_24_0.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
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('тревога')) {
return success({
message: 'Приступ тревоги или паники — это временная реакция амигдалы. Давайте выполним пошаговую технику "Преодоление тревоги и паники", чтобы вернуть чувство безопасности.',
emotionalTone: 'supportive',
suggestions: ['Начать упражнение', 'Не сейчас'],
followUpQuestions: [],
memoryUpdates: ['User requested anxiety management exercise'],
confidenceLevel: 1.0,
exercise: {
id: 'anxiety_management',
name: 'Преодоление тревоги и паники',
type: 'grounding',
currentStep: -1,
steps: [
'Примите устойчивое положение. Ощутите стопами пол, расправьте плечи и глубоко вдохните.',
'Сделайте вдох на 4 секунды, задержите дыхание на 4 секунды и выдыхайте через рот на 6 секунд.',
'Посмотрите по сторонам и найдите 3 предмета синего или зеленого цвета.',
'Напомните себе: "Паника полностью безопасна для сердца. Это просто выброс адреналина, который утихнет через несколько минут".',
'Положите руку на грудь и сфокусируйтесь на плавном движении диафрагмы.'
]
}
});
}

if (lowercaseMessage.includes('мегаполис') || lowercaseMessage.includes('город') || lowercaseMessage.includes('шум') || lowercaseMessage.includes('детокс')) {
return success({
message: 'Стресс мегаполиса — частый триггер срыва. Давайте проведем сессию "Умного городского детокса", чтобы быстро сбросить напряжение и вернуть фокус. Начнем?',
Expand Down
60 changes: 60 additions & 0 deletions services/articlesDatabase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1316,6 +1316,66 @@ export const articlesDatabase: Article[] = [
tags: ['чаи', 'адаптогены', 'здоровье', 'релакс'],
icon: 'local-cafe',
color: '#4CAF50'
},
{
id: generateArticleId(103),
title: 'Нейробиология паники: как перехитрить амигдалу',
category: 'Наука о зависимости',
readTime: 7,
difficulty: 'intermediate',
preview: 'Анатомия приступа тревоги и физиологические механизмы ее угасания',
content: `Паническая атака активирует древний механизм "бей или беги" в амигдале. Высокая концентрация адреналина заставляет сердце биться чаще. Осознание того, что приступ адреналина метаболизируется печенью за 10-15 минут, помогает не паниковать из-за самой паники.`,
tags: ['паника', 'тревожность', 'амигдала', 'адреналин'],
icon: 'psychology',
color: '#9C27B0'
},
{
id: generateArticleId(104),
title: 'Соматическое заземление при фоновой тревоге',
category: 'Психология восстановления',
readTime: 6,
difficulty: 'beginner',
preview: 'Телесные практики переключения внимания из мыслей в тело',
content: `Фоновая тревога фиксирует внимание внутри ума. Техника "5 опор" включает прочувствование стоп на полу, спины на стуле, температуру воздуха, звуки вокруг и ритм дыхания. Заземление мгновенно возвращает мозг в режим физической безопасности.`,
tags: ['заземление', 'тело', 'тревожность', 'практики'],
icon: 'spa',
color: '#3F51B5'
},
{
id: generateArticleId(105),
title: 'Синдром гипервентиляции и метод бумажного пакета',
category: 'Здоровье и Тело',
readTime: 5,
difficulty: 'beginner',
preview: 'Как восстановить баланс O2 и CO2 при приступе паники',
content: `При панике часто возникает частая гипервентиляция, вымывающая углекислый газ из крови и вызвающая головокружение. Медленное дыхание в ладони или бумажный пакет помогает вернуть уровень CO2 в норму и быстро снять спазм сосудов.`,
tags: ['дыхание', 'паника', 'гипервентиляция', 'здоровье'],
icon: 'air',
color: '#4CAF50'
},
{
id: generateArticleId(106),
title: 'Когнитивные искажения тревожного мозга',
category: 'Психология восстановления',
readTime: 8,
difficulty: 'advanced',
preview: 'Разбор ловушек катастрофизации и чтение мыслей',
content: `Тревожный мозг в периоды восстановления подвержен когнитивным искажениям: катастрофизации ("все рухнет") и чтению мыслей ("они думают обо мне плохо"). Ведение дневника КПТ с разбором фактов помогает нейтрализовать эти тревожные концепции.`,
tags: ['КПТ', 'мысли', 'тревога', 'когниции'],
icon: 'psychology',
color: '#3F51B5'
},
{
id: generateArticleId(107),
title: 'Роль магния треоната и Л-теанина при стрессе',
category: 'Здоровье и Тело',
readTime: 6,
difficulty: 'intermediate',
preview: 'Нутрицевтики для поддержки ГАМК-рецепторов при отмене',
content: `Л-теанин способствует снижению возбудимости ЦНС и выработке альфа-волн в мозге, а магний треонат способно легко проникать через гематоэнцефалический барьер, улучшая пластичность синапсов и устойчивость к стрессовым нагрузкам.`,
tags: ['нутриенты', 'магний', 'теанин', 'стресс'],
icon: 'local-pharmacy',
color: '#4CAF50'
}
];

Expand Down
27 changes: 27 additions & 0 deletions services/communityService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1499,4 +1499,31 @@ export class CommunityService {
}
}

/**
* Отправить стикер поддержки у застенчивого участника (+15 Кармы).
*/
static async sendSupportSticker(stickerId: string, recipientName: string): Promise<boolean> {
try {
await this.addKarmaPoints(15);
await this.updateUserKarma(recipientName, 5);
return true;
} catch (e) {
return false;
}
}

/**
* Отправить знак признательности своему напарнику (+10 Кармы).
*/
static async sendBuddyAppreciation(message: string): Promise<boolean> {
try {
const buddy = await this.getSelectedBuddy();
if (!buddy) return false;
await this.addKarmaPoints(10);
return true;
} catch (e) {
return false;
}
}

}
33 changes: 33 additions & 0 deletions services/microCoursesDatabase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -350,5 +350,38 @@ export const microCoursesDatabase: MicroCourse[] = [
type: 'text'
}
]
},
{
id: 'anxiety_and_panic_control',
title: 'Управление тревогой и паникой',
description: 'Практическое руководство по купированию приступов паники и хронической тревожности в трезвости.',
category: 'foundation',
difficulty: 'intermediate',
icon: 'psychology',
points: 150,
lessons: [
{
id: 'ap_l1',
title: 'Нейробиология панической атаки',
content: 'Паническая атака — это ложная тревожная сигнализация миндалевидного тела (амигдалы). Выделение адреналина создает иллюзию катастрофы, но физически паника совершенно безопасна для сердца и сосудов.',
duration: 6,
type: 'text'
},
{
id: 'ap_l2',
title: 'Соматическое заземление',
content: 'При нарастании тревоги перенесите фокус на физические опоры: почувствуйте стопами твердый пол, нажмите ладонями друг на друга и выполните 5 медленных выдохов через рот.',
duration: 8,
type: 'exercise',
exerciseId: 'box-breathing'
},
{
id: 'ap_l3',
title: 'Протокол анти-паника',
content: 'Пошаговый алгоритм действий при приступе: не убегайте с места, замедлите дыхание, напомните себе "это просто выброс адреналина, он утихнет через 10 минут".',
duration: 10,
type: 'text'
}
]
}
];
Loading