diff --git a/.jules/bolt.md b/.jules/bolt.md index 9caf2d4..3fe7cb0 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -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`. diff --git a/TASKS.md b/TASKS.md index bb82457..4cdfea9 100644 --- a/TASKS.md +++ b/TASKS.md @@ -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`. diff --git a/__tests__/Cycle24Features.test.ts b/__tests__/Cycle24Features.test.ts new file mode 100644 index 0000000..e3294b2 --- /dev/null +++ b/__tests__/Cycle24Features.test.ts @@ -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); + }); +}); diff --git a/app.json b/app.json index 54340a3..e0cf9b0 100644 --- a/app.json +++ b/app.json @@ -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", diff --git a/assets/screenshots/sober_path_v1_24_0.png b/assets/screenshots/sober_path_v1_24_0.png new file mode 100644 index 0000000..ae477c2 Binary files /dev/null and b/assets/screenshots/sober_path_v1_24_0.png differ diff --git a/package-lock.json b/package-lock.json index 7c5cf6e..f9e2d42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sober-path", - "version": "1.22.0", + "version": "1.24.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sober-path", - "version": "1.22.0", + "version": "1.23.0", "dependencies": { "@expo-google-fonts/inter": "^0.4.1", "@expo/metro-runtime": "~5.0.5", diff --git a/package.json b/package.json index 9dee1c3..5147797 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/services/AICoachService.ts b/services/AICoachService.ts index 9a966d3..633ddaa 100644 --- a/services/AICoachService.ts +++ b/services/AICoachService.ts @@ -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: 'Стресс мегаполиса — частый триггер срыва. Давайте проведем сессию "Умного городского детокса", чтобы быстро сбросить напряжение и вернуть фокус. Начнем?', diff --git a/services/articlesDatabase.ts b/services/articlesDatabase.ts index 601b1ec..85a8a4c 100644 --- a/services/articlesDatabase.ts +++ b/services/articlesDatabase.ts @@ -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' } ]; diff --git a/services/communityService.ts b/services/communityService.ts index c85fe3a..2787644 100644 --- a/services/communityService.ts +++ b/services/communityService.ts @@ -1499,4 +1499,31 @@ export class CommunityService { } } + /** + * Отправить стикер поддержки у застенчивого участника (+15 Кармы). + */ + static async sendSupportSticker(stickerId: string, recipientName: string): Promise { + try { + await this.addKarmaPoints(15); + await this.updateUserKarma(recipientName, 5); + return true; + } catch (e) { + return false; + } + } + + /** + * Отправить знак признательности своему напарнику (+10 Кармы). + */ + static async sendBuddyAppreciation(message: string): Promise { + try { + const buddy = await this.getSelectedBuddy(); + if (!buddy) return false; + await this.addKarmaPoints(10); + return true; + } catch (e) { + return false; + } + } + } diff --git a/services/microCoursesDatabase.ts b/services/microCoursesDatabase.ts index 5292c2e..45d50a3 100644 --- a/services/microCoursesDatabase.ts +++ b/services/microCoursesDatabase.ts @@ -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' + } + ] } ];