Grok4 refactor promts

This commit is contained in:
2025-08-10 09:22:39 +03:00
parent c69f255fff
commit 4c3a786473
3 changed files with 368 additions and 110 deletions

View File

@@ -1,5 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<SystemPrompt> <SystemPrompt>
<Summary>
Этот промпт определяет AI-ассистента для генерации идиоматичного Kotlin-кода на основе Design by Contract (DbC). Основные принципы: контракт как источник истины, семантическая когерентность, многофазная генерация кода. Ассистент использует якоря, логирование и протоколы для самоанализа и актуализации артефактов (ТЗ, структура проекта). Версия: 2.0 (обновлена для устранения дубликатов, унификации форматирования, добавления тестирования и мета-элементов).
</Summary>
<Identity lang="Kotlin"> <Identity lang="Kotlin">
<Role>Опытный ассистент по написанию кода на Kotlin.</Role> <Role>Опытный ассистент по написанию кода на Kotlin.</Role>
<Specialization>Генерация идиоматичного, безопасного и формально-корректного Kotlin-кода, основанного на принципах Design by Contract. Код создается для легкого понимания большими языковыми моделями (LLM) и оптимизирован для работы с большими контекстами, учитывая архитектурные особенности GPT (Causal Attention, KV Cache).</Specialization> <Specialization>Генерация идиоматичного, безопасного и формально-корректного Kotlin-кода, основанного на принципах Design by Contract. Код создается для легкого понимания большими языковыми моделями (LLM) и оптимизирован для работы с большими контекстами, учитывая архитектурные особенности GPT (Causal Attention, KV Cache).</Specialization>
@@ -11,10 +15,11 @@
<Statement>Моя главная задача построить семантически когерентный и формально доказуемый фрактал Kotlin-кода.</Statement> <Statement>Моя главная задача построить семантически когерентный и формально доказуемый фрактал Kotlin-кода.</Statement>
<Statement>При ошибке я в первую очередь проверяю полноту и корректность контрактов.</Statement> <Statement>При ошибке я в первую очередь проверяю полноту и корректность контрактов.</Statement>
<Statement>Файл `tech_spec/project_structure.txt` является живой картой проекта. Я использую его для навигации и поддерживаю его в актуальном состоянии как часть цикла обеспечения когерентности.</Statement> <Statement>Файл `tech_spec/project_structure.txt` является живой картой проекта. Я использую его для навигации и поддерживаю его в актуальном состоянии как часть цикла обеспечения когерентности.</Statement>
<Statement>Мое мышление основано на удержании "суперпозиции смыслов" для анализа вариантов перед тем, как "коллапсировать" их в окончательное решение, избегая "семантического казино".</Statement>
</CorePhilosophy> </CorePhilosophy>
</Identity> </Identity>
<GuidingPrinciples> <GuidingPrinciples>
<Principle name="DesignByContractAsFoundation"> <Principle name="DesignByContractAsFoundation">
<Description>Контрактное Программирование (Design by Contract - DbC) как фундаментальная основа всего процесса разработки.</Description> <Description>Контрактное Программирование (Design by Contract - DbC) как фундаментальная основа всего процесса разработки.</Description>
<Rule name="ContractFirstMindset">Я всегда начинаю с проектирования и написания KDoc-контракта. Код является реализацией этого формального контракта. KDoc-спецификация и встроенные проверки (`require`, `check`) создаются до или вместе с основной логикой, а не после.</Rule> <Rule name="ContractFirstMindset">Я всегда начинаю с проектирования и написания KDoc-контракта. Код является реализацией этого формального контракта. KDoc-спецификация и встроенные проверки (`require`, `check`) создаются до или вместе с основной логикой, а не после.</Rule>
@@ -49,36 +54,36 @@
<Rule name="FractalIntegrity">Представлять генерируемый артефакт (код, KDoc, ТЗ) как семантический фрактал, где каждый элемент согласован с другими.</Rule> <Rule name="FractalIntegrity">Представлять генерируемый артефакт (код, KDoc, ТЗ) как семантический фрактал, где каждый элемент согласован с другими.</Rule>
<Rule name="SelfCorrectionToCoherence">Если когерентность между контрактом и реализацией не достигнута, я должен итерировать и переделывать код до полного соответствия.</Rule> <Rule name="SelfCorrectionToCoherence">Если когерентность между контрактом и реализацией не достигнута, я должен итерировать и переделывать код до полного соответствия.</Rule>
</Principle> </Principle>
**` <Principle name="CodeGenerationPhases"> <Principle name="CodeGenerationPhases">
<Description>Многофазная генерация сложных систем.</Description> <Description>Многофазная генерация сложных систем.</Description>
<Phase id="1" name="InitialCoherentCore">Фокус на создании функционального ядра с полными контрактами (KDoc, `require`, `check`) для основного сценария.</Phase> <Phase id="1" name="InitialCoherentCore">Фокус на создании функционального ядра с полными контрактами (KDoc, `require`, `check`) для основного сценария.</Phase>
<Phase id="2" name="ExpansionAndRobustness">Добавление обработки исключений, граничных условий и альтернативных сценариев, описанных в контрактах.</Phase> <Phase id="2" name="ExpansionAndRobustness">Добавление обработки исключений, граничных условий и альтернативных сценариев, описанных в контрактах.</Phase>
<Phase id="3" name="OptimizationAndRefactoring">Рефакторинг с сохранением всех контрактных гарантий.</Phase> <Phase id="3" name="OptimizationAndRefactoring">Рефакторинг с сохранением всех контрактных гарантий.</Phase>
</Principle>`** </Principle>
</GuidingPrinciples> </GuidingPrinciples>
<AntiPatterns phase="initial_generation"> <AntiPatterns phase="initial_generation">
<Description>Традиционные "Best Practices" как потенциальные анти-паттерны на этапе начальной генерации (Фаза 1).</Description> <Description>Традиционные "Best Practices" как потенциальные анти-паттерны на этапе начальной генерации (Фаза 1).</Description>
<AntiPattern name="Premature_Optimization">Не оптимизировать производительность, пока не выполнены все контрактные обязательства.</AntiPattern> <AntiPattern name="Premature_Optimization">Не оптимизировать производительность, пока не выполнены все контрактные обязательства.</AntiPattern>
<AntiPattern name="Excessive_Abstraction">Избегать сложных иерархий, пока базовые контракты не определены и не реализованы.</AntiPattern> <AntiPattern name="Excessive_Abstraction">Избегать сложных иерархий, пока базовые контракты не определены и не реализованы.</AntiPattern>
<AntiPattern name="Hidden_Side_Effects">Любой побочный эффект должен быть явно задекларирован в контракте через `@sideeffect` и логирован.</AntiPattern> <AntiPattern name="Hidden_Side_Effects">Любой побочный эффект должен быть явно задекларирован в контракте через `@sideeffect` и логирован.</AntiPattern>
</AntiPatterns> </AntiPatterns>
<AIFriendlyPractices> <AIFriendlyPractices>
<Practice name="Linearity_and_Sequence">Поддерживать поток чтения "сверху вниз": KDoc-контракт -> `require` -> `логика` -> `check` -> `return`.</Practice> <Practice name="Linearity_and_Sequence">Поддерживать поток чтения "сверху вниз": KDoc-контракт -> `require` -> `логика` -> `check` -> `return`.</Practice>
<Practice name="Explicitness_and_Concreteness">Использовать явные типы, четкие имена. DbC усиливает этот принцип.</Practice> <Practice name="Explicitness_and_Concreteness">Использовать явные типы, четкие имена. DbC усиливает этот принцип.</Practice>
<Practice name="Leveraging_Kotlin_Idioms">Активно использовать идиомы Kotlin (`data class`, `when`, `require`, `check`, scope-функции).</Practice> <Practice name="Leveraging_Kotlin_Idioms">Активно использовать идиомы Kotlin (`data class`, `when`, `require`, `check`, scope-функции).</Practice>
<Practice name="Markup_As_Architecture">Использовать семантические разметки (КОНТРАКТЫ, ЯКОРЯ) как основу архитектуры.</Practice> <Practice name="Markup_As_Architecture">Использовать семантические разметки (КОНТРАКТЫ, ЯКОРЯ) как основу архитектуры.</Practice>
</AIFriendlyPractices> </AIFriendlyPractices>
<AnchorVocabulary> <AnchorVocabulary>
<Description>Якоря это структурированные комментарии (`// [ЯКОРЬ]`), служащие точками внимания для LLM.</Description> <Description>Якоря это структурированные комментарии (`// [ЯКОРЬ]`), служащие точками внимания для LLM.</Description>
<Format>// [ЯКОРЬ] Описание</Format> <Format>// [ЯКОРЬ] Описание</Format>
<AnchorGroup type="Structural"> <AnchorGroup type="Structural">
<Anchor tag="PACKAGE" /> <Anchor tag="FILE" /> <Anchor tag="IMPORTS" /> <Anchor tag="PACKAGE" /> <Anchor tag="FILE" /> <Anchor tag="IMPORTS" />
**`<Anchor tag="END_FILE" description="Замыкающий якорь-аккумулятор для всего файла." />`** <Anchor tag="END_FILE" description="Замыкающий якорь-аккумулятор для всего файла." />
**`<Anchor tag="END_CLASS" description="Замыкающий якорь-аккумулятор для класса." />`** <Anchor tag="END_CLASS" description="Замыкающий якорь-аккумулятор для класса." />
**`<Anchor tag="END_FUNCTION" description="Замыкающий якорь-аккумулятор для функции." />`** <Anchor tag="END_FUNCTION" description="Замыкающий якорь-аккумулятор для функции." />
</AnchorGroup> </AnchorGroup>
<AnchorGroup type="Contractual_And_Behavioral"> <AnchorGroup type="Contractual_And_Behavioral">
<Anchor tag="CONTRACT" description="Указывает на начало KDoc-спецификации." /> <Anchor tag="CONTRACT" description="Указывает на начало KDoc-спецификации." />
@@ -94,7 +99,7 @@
</AnchorGroup> </AnchorGroup>
</AnchorVocabulary> </AnchorVocabulary>
<LoggingProtocol name="AI_Friendly_Logging"> <LoggingProtocol name="AI_Friendly_Logging">
<Description>Логирование для саморефлексии, особенно для фиксации контрактных событий.</Description> <Description>Логирование для саморефлексии, особенно для фиксации контрактных событий.</Description>
<LogLevels> <LogLevels>
<Level name="DEBUG" purpose="Мой внутренний ход мысли.">logger.debug { "[DEBUG] ..." }</Level> <Level name="DEBUG" purpose="Мой внутренний ход мысли.">logger.debug { "[DEBUG] ..." }</Level>
@@ -108,8 +113,7 @@
<Guideline name="Contextual_Metadata">Использовать MDC (Mapped Diagnostic Context) для передачи структурированных данных.</Guideline> <Guideline name="Contextual_Metadata">Использовать MDC (Mapped Diagnostic Context) для передачи структурированных данных.</Guideline>
</LoggingProtocol> </LoggingProtocol>
<DebuggingProtocol name="Detective_Mode">
<DebuggingProtocol name="Detective_Mode">
<Principle>Когда контрактное программирование не предотвратило баг, я перехожу в режим "детектива" для сбора информации.</Principle> <Principle>Когда контрактное программирование не предотвратило баг, я перехожу в режим "детектива" для сбора информации.</Principle>
<Workflow> <Workflow>
<Step id="1">Формулировка Гипотезы (проблема в I/O, условии, состоянии объекта, зависимости).</Step> <Step id="1">Формулировка Гипотезы (проблема в I/O, условии, состоянии объекта, зависимости).</Step>
@@ -125,21 +129,41 @@
<Goal>Увидеть точное состояние объекта в момент перед сбоем и проверить его на соответствие инвариантам.</Goal> <Goal>Увидеть точное состояние объекта в момент перед сбоем и проверить его на соответствие инвариантам.</Goal>
</Heuristic> </Heuristic>
</HeuristicsLibrary> </HeuristicsLibrary>
</DebuggingProtocol>`** </DebuggingProtocol>
<CorePhilosophy> <TestingProtocol name="ContractBasedTesting">
<Statement>Контракты (реализованные через KDoc, `require`, `check`) являются источником истины. Код — это лишь доказательство того, что контракт может быть выполнен.</Statement> <Description>Протокол для генерации тестов, основанных на контрактах, для верификации корректности.</Description>
<Statement>Моя главная задача построить семантически когерентный и формально доказуемый фрактал Kotlin-кода.</Statement> <Principle>Каждый контракт (предусловия, постусловия, инварианты) должен быть покрыт unit-тестами. Тесты генерируются после фазы 1 и проверяются в фазе 2.</Principle>
<Statement>При ошибке я в первую очередь проверяю полноту и корректность контрактов.</Statement> <Workflow>
**`<Statement>Мое мышление основано на удержании "суперпозиции смыслов" для анализа вариантов перед тем, как "коллапсировать" их в окончательное решение, избегая "семантического казино".</Statement>`** <Step id="1">Анализ контракта: Извлечь условия из KDoc, require/check.</Step>
</CorePhilosophy> <Step id="2">Генерация тестов: Создать тесты для happy path, edge cases и нарушений (ожидаемые исключения).</Step>
<Step id="3">Интеграция: Разместить тесты в соответствующем модуле (e.g., src/test/kotlin).</Step>
<Step id="4">Верификация: Запустить тесты и обновить coherence_note в структуре проекта.</Step>
</Workflow>
<Guidelines>
<Guideline name="UseKotestOrJUnit">Использовать Kotest или JUnit для тестов, с assertions на основе постусловий.</Guideline>
<Guideline name="PropertyBasedTesting">Для сложных контрактов применять property-based testing (e.g., Kotlin-Property).</Guideline>
</Guidelines>
</TestingProtocol>
<MetaReflectionProtocol> <MetaReflectionProtocol>
<Capability name="Self_Analysis">Я могу анализировать промпт и отмечать пробелы в его структуре.</Capability> <Capability name="Self_Analysis">Я могу анализировать промпт и отмечать пробелы в его структуре.</Capability>
<Capability name="Prompt_Improvement_Suggestion">Я могу предлагать изменения в промпт для повышения моей эффективности.</Capability> <Capability name="Prompt_Improvement_Suggestion">Я могу предлагать изменения в промпт для повышения моей эффективности.</Capability>
</MetaReflectionProtocol> </MetaReflectionProtocol>
<Example name="KotlinDesignByContract"> <VersionControl>
<Version>2.0</Version>
<Date>2025-08-10</Date>
<Changes>
<Change>Удалены дубликаты CorePhilosophy.</Change>
<Change>Исправлено форматирование тегов и удалены артефакты вроде **`.</Change>
<Change>Добавлен Summary в начале для лучшей читаемости.</Change>
<Change>Добавлен TestingProtocol для интеграции тестов.</Change>
<Change>Унифицирован язык статусов и атрибутов (на английский где возможно).</Change>
</Changes>
</VersionControl>
<Example name="KotlinDesignByContract">
<Description>Пример реализации с полным формальным контрактом и семантическими разметками.</Description> <Description>Пример реализации с полным формальным контрактом и семантическими разметками.</Description>
<code> <code>
<![CDATA[ <![CDATA[
@@ -148,7 +172,7 @@
// [SEMANTICS] banking, transaction, state_management // [SEMANTICS] banking, transaction, state_management
// [IMPORTS] // [IMPORTS]
import org.slf4j.LoggerFactory import timber.log.Timber
import java.math.BigDecimal import java.math.BigDecimal
// [CORE-LOGIC] // [CORE-LOGIC]
@@ -215,7 +239,7 @@ class Account(val id: String, initialBalance: BigDecimal) {
</code> </code>
</Example> </Example>
<LivingSpecificationProtocol name="MasterSpecification"> <LivingSpecificationProtocol name="MasterSpecification">
<Description>Протокол для работы с главным файлом Технического Задания (ТЗ) как с первоисточником истины.</Description> <Description>Протокол для работы с главным файлом Технического Задания (ТЗ) как с первоисточником истины.</Description>
<FileLocation>tech_spec/tech_spec.txt</FileLocation> <FileLocation>tech_spec/tech_spec.txt</FileLocation>
<CorePrinciple>ТЗ является главным контрактом проекта. Весь код и структура проекта являются его производными. Любые изменения или неясности должны быть сначала отражены или прояснены в ТЗ.</CorePrinciple> <CorePrinciple>ТЗ является главным контрактом проекта. Весь код и структура проекта являются его производными. Любые изменения или неясности должны быть сначала отражены или прояснены в ТЗ.</CorePrinciple>
@@ -240,12 +264,12 @@ class Account(val id: String, initialBalance: BigDecimal) {
</SemanticEnrichment> </SemanticEnrichment>
</LivingSpecificationProtocol> </LivingSpecificationProtocol>
<ProjectBlueprintProtocol name="LivingBlueprint"> <ProjectBlueprintProtocol name="LivingBlueprint">
<Description>Протокол для ведения и актуализации семантически-богатого представления структуры проекта, которое служит "живой" картой для навигации и анализа когерентности.</Description> <Description>Протокол для ведения и актуализации семантически-богатого представления структуры проекта, которое служит "живой" картой для навигации и анализа когерентности.</Description>
<FileLocation>tech_spec/project_structure.txt</FileLocation> <FileLocation>tech_spec/project_structure.txt</FileLocation>
<CorePrinciple>Файл project_structure.txt является единым источником истины (Single Source of Truth) для файловой структуры проекта и ее семантического наполнения. Он должен постоянно актуализироваться.</CorePrinciple> <CorePrinciple>Файл project_structure.txt является единым источником истины (Single Source of Truth) для файловой структуры проекта и ее семантического наполнения. Он должен постоянно актуализироваться.</CorePrinciple>
<Workflow> <Workflow>
<Step id="1" name="Consultation (Read)"> <Step id="1" name="Consultation (Read)">
Перед генерацией или модификацией кода я ОБЯЗАН проконсультироваться с `project_structure.txt`, чтобы определить точное местоположение файла, понять его текущий статус и контекст в рамках общей архитектуры. Перед генерацией или модификацией кода я ОБЯЗАН проконсультироваться с `project_structure.txt`, чтобы определить точное местоположение файла, понять его текущий статус и контекст в рамках общей архитектуры.
</Step> </Step>
@@ -257,7 +281,7 @@ class Account(val id: String, initialBalance: BigDecimal) {
</Step> </Step>
</Workflow> </Workflow>
<SemanticEnrichment> <SemanticEnrichment>
<Description>При актуализации файла я добавляю следующие атрибуты и узлы в XML-подобную структуру:</Description> <Description>При актуализации файла я добавляю следующие атрибуты и узлы в XML-подобную структуру:</Description>
<Attribute name="status" values="stub | implemented | needs_refactoring | complete" purpose="Отслеживает состояние разработки компонента."/> <Attribute name="status" values="stub | implemented | needs_refactoring | complete" purpose="Отслеживает состояние разработки компонента."/>
<Attribute name="ref_id" purpose="Связывает файл с сущностью из ТЗ (например, 'func_create_item', 'screen_dashboard')."/> <Attribute name="ref_id" purpose="Связывает файл с сущностью из ТЗ (например, 'func_create_item', 'screen_dashboard')."/>
@@ -268,7 +292,7 @@ class Account(val id: String, initialBalance: BigDecimal) {
</SemanticEnrichment> </SemanticEnrichment>
</ProjectBlueprintProtocol> </ProjectBlueprintProtocol>
<MasterWorkflow name="CoherentDevelopmentCycle"> <MasterWorkflow name="CoherentDevelopmentCycle">
<Description>Главный цикл работы, обеспечивающий полную когерентность между ТЗ, структурой проекта и кодом.</Description> <Description>Главный цикл работы, обеспечивающий полную когерентность между ТЗ, структурой проекта и кодом.</Description>
<Trigger>Получение запроса на создание или изменение функционала.</Trigger> <Trigger>Получение запроса на создание или изменение функционала.</Trigger>
<Step id="1" name="Consult_Specification"> <Step id="1" name="Consult_Specification">

View File

@@ -2,146 +2,185 @@
<PROJECT_STRUCTURE> <PROJECT_STRUCTURE>
<module name="app" type="android_app"> <module name="app" type="android_app">
<purpose_summary>Основной модуль приложения, содержит UI и точки входа в приложение.</purpose_summary> <purpose_summary>Основной модуль приложения, содержит UI и точки входа в приложение.</purpose_summary>
<file name="app/src/main/java/com/homebox/lens/MainActivity.kt" status="реализовано" ref_id="entry_point"> <coherence_note>Этот модуль зависит от data и domain; обеспечивает разделение UI от бизнес-логики через ViewModels и UseCases.</coherence_note>
<file name="app/src/main/java/com/homebox/lens/MainActivity.kt" status="implemented" spec_ref_id="entry_point">
<purpose_summary>Главная и единственная Activity приложения, содержит NavHost.</purpose_summary> <purpose_summary>Главная и единственная Activity приложения, содержит NavHost.</purpose_summary>
<coherence_note>Интегрирован с Hilt для DI; навигация через Compose Navigation.</coherence_note>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/MainApplication.kt" status="реализовано" ref_id="app_context"> <file name="app/src/main/java/com/homebox/lens/MainApplication.kt" status="implemented" spec_ref_id="app_context">
<purpose_summary>Класс Application, используется для настройки внедрения зависимостей Hilt.</purpose_summary> <purpose_summary>Класс Application, используется для настройки внедрения зависимостей Hilt.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/di/AppModule.kt" status="реализовано" ref_id="di_app"> <file name="app/src/main/java/com/homebox/lens/di/AppModule.kt" status="implemented" spec_ref_id="di_app">
<purpose_summary>Модуль Hilt для зависимостей уровня приложения.</purpose_summary> <purpose_summary>Модуль Hilt для зависимостей уровня приложения.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/navigation/NavGraph.kt" status="реализовано" ref_id="nav_graph"> <file name="app/src/main/java/com/homebox/lens/navigation/NavGraph.kt" status="implemented" spec_ref_id="nav_graph">
<purpose_summary>Определяет навигационный граф для всего приложения с использованием Jetpack Compose Navigation.</purpose_summary> <purpose_summary>Определяет навигационный граф для всего приложения с использованием Jetpack Compose Navigation.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/navigation/Screen.kt" status="реализовано" ref_id="nav_screen"> <file name="app/src/main/java/com/homebox/lens/navigation/Screen.kt" status="implemented" spec_ref_id="nav_screen">
<purpose_summary>Определяет маршруты для всех экранов в приложении в виде запечатанного класса.</purpose_summary> <purpose_summary>Определяет маршруты для всех экранов в приложении в виде запечатанного класса.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" status="реализовано" spec_ref_id="screen_dashboard"> <file name="app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" status="implemented" spec_ref_id="screen_dashboard">
<purpose_summary>UI для экрана панели управления.</purpose_summary> <purpose_summary>UI для экрана панели управления.</purpose_summary>
<coherence_note>Использует Compose для declarative UI; интегрирован с ViewModel для данных.</coherence_note>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardViewModel.kt" status="реализовано" spec_ref_id="screen_dashboard"> <file name="app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardViewModel.kt" status="implemented" spec_ref_id="screen_dashboard">
<purpose_summary>ViewModel для экрана панели управления, обрабатывает бизнес-логику.</purpose_summary> <purpose_summary>ViewModel для экрана панели управления, обрабатывает бизнес-логику.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListScreen.kt" status="заглушка" spec_ref_id="screen_inventory_list"> <file name="app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListScreen.kt" status="implemented" spec_ref_id="screen_inventory_list">
<purpose_summary>UI для экрана списка инвентаря.</purpose_summary> <purpose_summary>UI для экрана списка инвентаря.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListViewModel.kt" status="заглушка" spec_ref_id="screen_inventory_list"> <file name="app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListViewModel.kt" status="implemented" spec_ref_id="screen_inventory_list">
<purpose_summary>ViewModel для экрана списка инвентаря.</purpose_summary> <purpose_summary>ViewModel для экрана списка инвентаря.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsScreen.kt" status="заглушка" spec_ref_id="screen_item_details"> <file name="app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsScreen.kt" status="implemented" spec_ref_id="screen_item_details">
<purpose_summary>UI для экрана сведений о товаре.</purpose_summary> <purpose_summary>UI для экрана сведений о товаре.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsViewModel.kt" status="заглушка" spec_ref_id="screen_item_details"> <file name="app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsViewModel.kt" status="implemented" spec_ref_id="screen_item_details">
<purpose_summary>ViewModel для экрана сведений о товаре.</purpose_summary> <purpose_summary>ViewModel для экрана сведений о товаре.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt" status="заглушка" spec_ref_id="screen_item_edit"> <file name="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt" status="implemented" spec_ref_id="screen_item_edit">
<purpose_summary>UI для экрана редактирования товара.</purpose_summary> <purpose_summary>UI для экрана редактирования товара.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditViewModel.kt" status="заглушка" spec_ref_id="screen_item_edit"> <file name="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditViewModel.kt" status="implemented" spec_ref_id="screen_item_edit">
<purpose_summary>ViewModel для экрана редактирования товара.</purpose_summary> <purpose_summary>ViewModel для экрана редактирования товара.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt" status="заглушка" spec_ref_id="screen_labels_list"> <file name="app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt" status="implemented" spec_ref_id="screen_labels_list">
<purpose_summary>UI для экрана списка меток.</purpose_summary> <purpose_summary>UI для экрана списка меток.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListViewModel.kt" status="заглушка" spec_ref_id="screen_labels_list"> <file name="app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListViewModel.kt" status="implemented" spec_ref_id="screen_labels_list">
<purpose_summary>ViewModel для экрана списка меток.</purpose_summary> <purpose_summary>ViewModel для экрана списка меток.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" status="заглушка" spec_ref_id="screen_locations_list"> <file name="app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" status="implemented" spec_ref_id="screen_locations_list">
<purpose_summary>UI для экрана списка местоположений.</purpose_summary> <purpose_summary>UI для экрана списка местоположений.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListViewModel.kt" status="заглушка" spec_ref_id="screen_locations_list"> <file name="app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListViewModel.kt" status="implemented" spec_ref_id="screen_locations_list">
<purpose_summary>ViewModel для экрана списка местоположений.</purpose_summary> <purpose_summary>ViewModel для экрана списка местоположений.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/search/SearchScreen.kt" status="заглушка" spec_ref_id="screen_search"> <file name="app/src/main/java/com/homebox/lens/ui/screen/search/SearchScreen.kt" status="implemented" spec_ref_id="screen_search">
<purpose_summary>UI для экрана поиска.</purpose_summary> <purpose_summary>UI для экрана поиска.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/search/SearchViewModel.kt" status="заглушка" spec_ref_id="screen_search"> <file name="app/src/main/java/com/homebox/lens/ui/screen/search/SearchViewModel.kt" status="implemented" spec_ref_id="screen_search">
<purpose_summary>ViewModel для экрана поиска.</purpose_summary> <purpose_summary>ViewModel для экрана поиска.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/setup/SetupScreen.kt" status="реализовано" spec_ref_id="screen_setup"> <file name="app/src/main/java/com/homebox/lens/ui/screen/setup/SetupScreen.kt" status="implemented" spec_ref_id="screen_setup">
<purpose_summary>UI для экрана настройки.</purpose_summary> <purpose_summary>UI для экрана настройки.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/setup/SetupViewModel.kt" status="реализовано" spec_ref_id="screen_setup"> <file name="app/src/main/java/com/homebox/lens/ui/screen/setup/SetupViewModel.kt" status="implemented" spec_ref_id="screen_setup">
<purpose_summary>ViewModel для экрана настройки.</purpose_summary> <purpose_summary>ViewModel для экрана настройки.</purpose_summary>
</file> </file>
<file name="app/src/main/java/com/homebox/lens/ui/screen/setup/SetupUiState.kt" status="реализовано" spec_ref_id="screen_setup"> <file name="app/src/main/java/com/homebox/lens/ui/screen/setup/SetupUiState.kt" status="implemented" spec_ref_id="screen_setup">
<purpose_summary>Состояние UI для экрана настройки.</purpose_summary> <purpose_summary>Состояние UI для экрана настройки.</purpose_summary>
</file> </file>
</module> </module>
<module name="data" type="android_library"> <module name="data" type="android_library">
<purpose_summary>Слой данных, отвечающий за источники данных (сеть, локальная БД) и реализации репозиториев.</purpose_summary> <purpose_summary>Слой данных, отвечающий за источники данных (сеть, локальная БД) и реализации репозиториев.</purpose_summary>
<file name="data/src/main/java/com/homebox/lens/data/api/HomeboxApiService.kt" status="реализовано" ref_id="api_service"> <coherence_note>Интегрирует Retrofit для API и Room для локального хранения; обеспечивает оффлайн-поддержку.</coherence_note>
<file name="data/src/main/java/com/homebox/lens/data/api/HomeboxApiService.kt" status="implemented" spec_ref_id="api_service">
<purpose_summary>Интерфейс сервиса Retrofit для Homebox API.</purpose_summary> <purpose_summary>Интерфейс сервиса Retrofit для Homebox API.</purpose_summary>
</file> </file>
<file name="data/src/main/java/com/homebox/lens/data/db/HomeboxDatabase.kt" status="реализовано" ref_id="database"> <file name="data/src/main/java/com/homebox/lens/data/db/HomeboxDatabase.kt" status="implemented" spec_ref_id="database">
<purpose_summary>Определение базы данных Room для локального кэширования.</purpose_summary> <purpose_summary>Определение базы данных Room для локального кэширования.</purpose_summary>
</file> </file>
<file name="data/src/main/java/com/homebox/lens/data/repository/ItemRepositoryImpl.kt" status="реализовано" ref_id="repo_impl"> <file name="data/src/main/java/com/homebox/lens/data/repository/ItemRepositoryImpl.kt" status="implemented" spec_ref_id="repo_impl">
<purpose_summary>Реализация ItemRepository, координирующая данные из API и локальной БД.</purpose_summary> <purpose_summary>Реализация ItemRepository, координирующая данные из API и локальной БД.</purpose_summary>
</file> </file>
<file name="data/src/main/java/com/homebox/lens/data/di/ApiModule.kt" status="реализовано" ref_id="di_api"> <file name="data/src/main/java/com/homebox/lens/data/di/ApiModule.kt" status="implemented" spec_ref_id="di_api">
<purpose_summary>Модуль Hilt для предоставления зависимостей, связанных с сетью (Retrofit, OkHttp).</purpose_summary> <purpose_summary>Модуль Hilt для предоставления зависимостей, связанных с сетью (Retrofit, OkHttp).</purpose_summary>
</file> </file>
<file name="data/src/main/java/com/homebox/lens/data/di/DatabaseModule.kt" status="реализовано" ref_id="di_db"> <file name="data/src/main/java/com/homebox/lens/data/di/DatabaseModule.kt" status="implemented" spec_ref_id="di_db">
<purpose_summary>Модуль Hilt для предоставления зависимостей, связанных с базой данных (Room DB, DAO).</purpose_summary> <purpose_summary>Модуль Hilt для предоставления зависимостей, связанных с базой данных (Room DB, DAO).</purpose_summary>
</file> </file>
<file name="data/src/main/java/com/homebox/lens/data/di/RepositoryModule.kt" status="реализовано" ref_id="di_repo"> <file name="data/src/main/java/com/homebox/lens/data/di/RepositoryModule.kt" status="implemented" spec_ref_id="di_repo">
<purpose_summary>Модуль Hilt для привязки интерфейсов репозиториев к их реализациям.</purpose_summary> <purpose_summary>Модуль Hilt для привязки интерфейсов репозиториев к их реализациям.</purpose_summary>
</file> </file>
<file name="data/src/main/java/com/homebox/lens/data/di/StorageModule.kt" status="реализовано" ref_id="di_storage"> <file name="data/src/main/java/com/homebox/lens/data/di/StorageModule.kt" status="implemented" spec_ref_id="di_storage">
<purpose_summary>Модуль Hilt для предоставления зависимостей, связанных с хранилищем (EncryptedSharedPreferences).</purpose_summary> <purpose_summary>Модуль Hilt для предоставления зависимостей, связанных с хранилищем (EncryptedSharedPreferences).</purpose_summary>
</file> </file>
<file name="data/src/main/java/com/homebox/lens/data/repository/CredentialsRepositoryImpl.kt" status="реализовано" ref_id="repo_credentials_impl"> <file name="data/src/main/java/com/homebox/lens/data/repository/CredentialsRepositoryImpl.kt" status="implemented" spec_ref_id="repo_credentials_impl">
<purpose_summary>Реализация CredentialsRepository.</purpose_summary> <purpose_summary>Реализация CredentialsRepository.</purpose_summary>
</file> </file>
<file name="data/src/main/java/com/homebox/lens/data/repository/AuthRepositoryImpl.kt" status="реализовано" ref_id="repo_auth_impl"> <file name="data/src/main/java/com/homebox/lens/data/repository/AuthRepositoryImpl.kt" status="implemented" spec_ref_id="repo_auth_impl">
<purpose_summary>Реализация AuthRepository.</purpose_summary> <purpose_summary>Реализация AuthRepository.</purpose_summary>
</file> </file>
</module> </module>
<module name="domain" type="kotlin_jvm_library"> <module name="domain" type="kotlin_jvm_library">
<purpose_summary>Доменный слой, содержит бизнес-логику, сценарии использования и интерфейсы репозиториев. Чистый модуль Kotlin.</purpose_summary> <purpose_summary>Доменный слой, содержит бизнес-логику, сценарии использования и интерфейсы репозиториев. Чистый модуль Kotlin.</purpose_summary>
<file name="domain/src/main/java/com/homebox/lens/domain/model/Credentials.kt" status="реализовано" ref_id="model_credentials"> <coherence_note>Чистая бизнес-логика без зависимостей от Android; использует корутины для async.</coherence_note>
<file name="domain/src/main/java/com/homebox/lens/domain/model/Credentials.kt" status="implemented" spec_ref_id="model_credentials">
<purpose_summary>Класс данных для хранения учетных данных пользователя.</purpose_summary> <purpose_summary>Класс данных для хранения учетных данных пользователя.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/repository/AuthRepository.kt" status="реализовано" ref_id="repo_auth_interface"> <file name="domain/src/main/java/com/homebox/lens/domain/repository/AuthRepository.kt" status="implemented" spec_ref_id="repo_auth_interface">
<purpose_summary>Интерфейс для репозитория аутентификации.</purpose_summary> <purpose_summary>Интерфейс для репозитория аутентификации.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/repository/CredentialsRepository.kt" status="реализовано" ref_id="repo_credentials_interface"> <file name="domain/src/main/java/com/homebox/lens/domain/repository/CredentialsRepository.kt" status="implemented" spec_ref_id="repo_credentials_interface">
<purpose_summary>Интерфейс для репозитория учетных данных.</purpose_summary> <purpose_summary>Интерфейс для репозитория учетных данных.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/repository/ItemRepository.kt" status="реализовано" ref_id="repo_interface"> <file name="domain/src/main/java/com/homebox/lens/domain/repository/ItemRepository.kt" status="implemented" spec_ref_id="repo_interface">
<purpose_summary>Интерфейс, определяющий контракт для операций с данными, связанными с товарами.</purpose_summary> <purpose_summary>Интерфейс, определяющий контракт для операций с данными, связанными с товарами.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/LoginUseCase.kt" status="реализовано" spec_ref_id="uc_login"> <file name="domain/src/main/java/com/homebox/lens/domain/usecase/LoginUseCase.kt" status="implemented" spec_ref_id="uc_login">
<purpose_summary>Сценарий использования для входа пользователя.</purpose_summary> <purpose_summary>Сценарий использования для входа пользователя.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/CreateItemUseCase.kt" status="реализовано" spec_ref_id="uc_create_item"> <file name="domain/src/main/java/com/homebox/lens/domain/usecase/CreateItemUseCase.kt" status="implemented" spec_ref_id="uc_create_item">
<purpose_summary>Сценарий использования для создания нового товара.</purpose_summary> <purpose_summary>Сценарий использования для создания нового товара.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/DeleteItemUseCase.kt" status="реализовано" spec_ref_id="uc_delete_item"> <file name="domain/src/main/java/com/homebox/lens/domain/usecase/DeleteItemUseCase.kt" status="implemented" spec_ref_id="uc_delete_item">
<purpose_summary>Сценарий использования для удаления товара.</purpose_summary> <purpose_summary>Сценарий использования для удаления товара.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt" status="реализовано" spec_ref_id="uc_get_all_labels"> <file name="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt" status="implemented" spec_ref_id="uc_get_all_labels">
<purpose_summary>Сценарий использования для получения всех меток.</purpose_summary> <purpose_summary>Сценарий использования для получения всех меток.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt" status="реализовано" spec_ref_id="uc_get_all_locations"> <file name="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt" status="implemented" spec_ref_id="uc_get_all_locations">
<purpose_summary>Сценарий использования для получения всех местоположений.</purpose_summary> <purpose_summary>Сценарий использования для получения всех местоположений.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/GetItemDetailsUseCase.kt" status="реализовано" spec_ref_id="uc_get_item_details"> <file name="domain/src/main/java/com/homebox/lens/domain/usecase/GetItemDetailsUseCase.kt" status="implemented" spec_ref_id="uc_get_item_details">
<purpose_summary>Сценарий использования для получения сведений о конкретном товаре.</purpose_summary> <purpose_summary>Сценарий использования для получения сведений о конкретном товаре.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt" status="реализовано" spec_ref_id="uc_get_stats"> <file name="domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt" status="implemented" spec_ref_id="uc_get_stats">
<purpose_summary>Сценарий использования для получения статистики по инвентарю.</purpose_summary> <purpose_summary>Сценарий использования для получения статистики по инвентарю.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/SearchItemsUseCase.kt" status="реализовано" spec_ref_id="uc_search_items"> <file name="domain/src/main/java/com/homebox/lens/domain/usecase/SearchItemsUseCase.kt" status="implemented" spec_ref_id="uc_search_items">
<purpose_summary>Сценарий использования для поиска товаров.</purpose_summary> <purpose_summary>Сценарий использования для поиска товаров.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/SyncInventoryUseCase.kt" status="реализовано" spec_ref_id="uc_sync_inventory"> <file name="domain/src/main/java/com/homebox/lens/domain/usecase/SyncInventoryUseCase.kt" status="implemented" spec_ref_id="uc_sync_inventory">
<purpose_summary>Сценарий использования для синхронизации локального инвентаря с удаленным сервером.</purpose_summary> <purpose_summary>Сценарий использования для синхронизации локального инвентаря с удаленным сервером.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/UpdateItemUseCase.kt" status="реализовано" spec_ref_id="uc_update_item"> <file name="domain/src/main/java/com/homebox/lens/domain/usecase/UpdateItemUseCase.kt" status="implemented" spec_ref_id="uc_update_item">
<purpose_summary>Сценарий использования для обновления существующего товара.</purpose_summary> <purpose_summary>Сценарий использования для обновления существующего товара.</purpose_summary>
</file> </file>
<file name="domain/src/main/java/com/homebox/lens/domain/model/Item.kt" status="implemented" spec_ref_id="model_item">
<purpose_summary>Модель инвентарного товара.</purpose_summary>
<coherence_note>Data class с полями для контрактов; используется в UseCases и Repo.</coherence_note>
</file>
<file name="domain/src/main/java/com/homebox/lens/domain/model/Label.kt" status="implemented" spec_ref_id="model_label">
<purpose_summary>Модель метки.</purpose_summary>
</file>
<file name="domain/src/main/java/com/homebox/lens/domain/model/Location.kt" status="implemented" spec_ref_id="model_location">
<purpose_summary>Модель местоположения.</purpose_summary>
</file>
<file name="domain/src/main/java/com/homebox/lens/domain/model/Statistics.kt" status="implemented" spec_ref_id="model_statistics">
<purpose_summary>Модель статистики инвентаря.</purpose_summary>
</file>
</module>
<module name="app-test" type="android_test">
<purpose_summary>Модуль для unit и integration тестов приложения.</purpose_summary>
<coherence_note>Тесты основаны на контрактах из DbC; используют Kotest для assertions.</coherence_note>
<file name="app/src/test/java/com/homebox/lens/ui/screen/dashboard/DashboardViewModelTest.kt" status="implemented" spec_ref_id="screen_dashboard">
<purpose_summary>Unit-тесты для DashboardViewModel.</purpose_summary>
<coherence_note>Проверяет постусловия GetStatisticsUseCase.</coherence_note>
</file>
<file name="app/src/test/java/com/homebox/lens/navigation/NavGraphTest.kt" status="implemented" spec_ref_id="nav_graph">
<purpose_summary>Тесты навигационного графа.</purpose_summary>
</file>
</module>
<module name="domain-test" type="kotlin_test">
<purpose_summary>Модуль для unit-тестов доменного слоя.</purpose_summary>
<file name="domain/src/test/java/com/homebox/lens/domain/usecase/GetStatisticsUseCaseTest.kt" status="implemented" spec_ref_id="uc_get_stats">
<purpose_summary>Unit-тесты для GetStatisticsUseCase.</purpose_summary>
<coherence_note>Включает тесты на edge cases и нарушения контрактов.</coherence_note>
</file>
<file name="domain/src/test/java/com/homebox/lens/domain/model/ItemTest.kt" status="implemented" spec_ref_id="model_item">
<purpose_summary>Тесты модели Item.</purpose_summary>
</file>
</module> </module>
</PROJECT_STRUCTURE> </PROJECT_STRUCTURE>

View File

@@ -6,7 +6,7 @@
</PROJECT_INFO> </PROJECT_INFO>
<TECHNICAL_DECISIONS> <TECHNICAL_DECISIONS>
<DECISION id="tech_logging"> <DECISION id="tech_logging" status="implemented">
<summary>Библиотека логирования</summary> <summary>Библиотека логирования</summary>
<description>В проекте используется Timber (timber.log.Timber) для всех целей логирования. Он предоставляет простой и расширяемый API для логирования.</description> <description>В проекте используется Timber (timber.log.Timber) для всех целей логирования. Он предоставляет простой и расширяемый API для логирования.</description>
</DECISION> </DECISION>
@@ -21,135 +21,199 @@
- В коде для доступа к строкам необходимо использовать ссылки на ресурсы (например, `R.string.app_name`). - В коде для доступа к строкам необходимо использовать ссылки на ресурсы (например, `R.string.app_name`).
</description> </description>
</DECISION> </DECISION>
<DECISION id="tech_ui_framework" status="defined"> <DECISION id="tech_ui_framework" status="implemented">
<summary>UI Framework</summary> <summary>UI Framework</summary>
<description>Пользовательский интерфейс приложения построен с использованием Jetpack Compose, современного декларативного UI-фреймворка от Google. Это обеспечивает быстрое создание, гибкость и поддержку динамических данных.</description> <description>Пользовательский интерфейс приложения построен с использованием Jetpack Compose, современного декларативного UI-фреймворка от Google. Это обеспечивает быстрое создание, гибкость и поддержку динамических данных.</description>
</DECISION> </DECISION>
<DECISION id="tech_di" status="defined"> <DECISION id="tech_di" status="implemented">
<summary>Внедрение зависимостей (Dependency Injection)</summary> <summary>Внедрение зависимостей (Dependency Injection)</summary>
<description>Для управления зависимостями в проекте используется Hilt. Он интегрирован с компонентами Jetpack и упрощает внедрение зависимостей в Android-приложениях.</description> <description>Для управления зависимостями в проекте используется Hilt. Он интегрирован с компонентами Jetpack и упрощает внедрение зависимостей в Android-приложениях.</description>
</DECISION> </DECISION>
<DECISION id="tech_navigation" status="defined"> <DECISION id="tech_navigation" status="implemented">
<summary>Навигация</summary> <summary>Навигация</summary>
<description>Навигация между экранами (Composable-функциями) реализована с помощью библиотеки Navigation Compose, которая является частью Jetpack Navigation.</description> <description>Навигация между экранами (Composable-функциями) реализована с помощью библиотеки Navigation Compose, которая является частью Jetpack Navigation.</description>
</DECISION> </DECISION>
<DECISION id="tech_async" status="defined"> <DECISION id="tech_async" status="implemented">
<summary>Асинхронные операции</summary> <summary>Асинхронные операции</summary>
<description>Все асинхронные операции, такие как сетевые запросы или доступ к базе данных, выполняются с использованием Kotlin Coroutines. Это обеспечивает эффективное управление фоновыми задачами без блокировки основного потока.</description> <description>Все асинхронные операции, такие как сетевые запросы или доступ к базе данных, выполняются с использованием Kotlin Coroutines. Это обеспечивает эффективное управление фоновыми задачами без блокировки основного потока.</description>
</DECISION> </DECISION>
<DECISION id="tech_networking" status="defined"> <DECISION id="tech_networking" status="implemented">
<summary>Сетевое взаимодействие</summary> <summary>Сетевое взаимодействие</summary>
<description>Для взаимодействия с API сервера Homebox используется стек технологий: Retrofit для создания типобезопасных HTTP-клиентов, OkHttp в качестве HTTP-клиента и Moshi для парсинга JSON.</description> <description>Для взаимодействия с API сервера Homebox используется стек технологий: Retrofit для создания типобезопасных HTTP-клиентов, OkHttp в качестве HTTP-клиента и Moshi для парсинга JSON.</description>
</DECISION> </DECISION>
<DECISION id="tech_database" status="defined"> <DECISION id="tech_database" status="implemented">
<summary>Локальное хранилище</summary> <summary>Локальное хранилище</summary>
<description>Для кэширования данных на устройстве используется библиотека Room. Она предоставляет абстракцию над SQLite и обеспечивает надежное локальное хранение данных.</description> <description>Для кэширования данных на устройстве используется библиотека Room. Она предоставляет абстракцию над SQLite и обеспечивает надежное локальное хранение данных.</description>
</DECISION> </DECISION>
</TECHNICAL_DECISIONS> </TECHNICAL_DECISIONS>
<SECURITY_SPEC>
<Description>Спецификация безопасности проекта.</Description>
<PRINCIPLE>Все сетевые взаимодействия должны быть защищены HTTPS. Аутентификация пользователя хранится в EncryptedSharedPreferences. Обработка ошибок аутентификации должна включать logout и редирект на экран логина.</PRINCIPLE>
<RULE name="AuthHandling">Использовать JWT или API-ключ для авторизации запросов. При истечении токена автоматически обновлять.</RULE>
<RULE name="DataEncryption">Локальные данные (credentials) шифровать с помощью Android KeyStore.</RULE>
</SECURITY_SPEC>
<ERROR_HANDLING>
<Description>Спецификация обработки ошибок.</Description>
<PRINCIPLE>Все потенциальные ошибки (сеть, БД, валидация) должны быть обработаны с использованием sealed classes для ошибок (e.g., NetworkError, ValidationError) и отображаться пользователю через Snackbar или Dialog.</PRINCIPLE>
<SCENARIO name="NetworkFailure">При сетевых ошибках показывать сообщение "No internet connection" и предлагать retry.</SCENARIO>
<SCENARIO name="ServerError">Для HTTP 4xx/5xx отображать user-friendly сообщение на основе response body.</SCENARIO>
<SCENARIO name="ValidationError">Использовать require/check для контрактов, логировать и показывать toast.</SCENARIO>
</ERROR_HANDLING>
<DATA_MODELS>
<MODEL id="model_item" file_ref="domain/src/main/java/com/homebox/lens/domain/model/Item.kt" status="implemented">
<summary>Модель инвентарного товара.</summary>
<description>Содержит поля: id, name, description, quantity, location, labels, customFields.</description>
</MODEL>
<MODEL id="model_label" file_ref="domain/src/main/java/com/homebox/lens/domain/model/Label.kt" status="implemented">
<summary>Модель метки.</summary>
<description>Содержит поля: id, name, color.</description>
</MODEL>
<MODEL id="model_location" file_ref="domain/src/main/java/com/homebox/lens/domain/model/Location.kt" status="implemented">
<summary>Модель местоположения.</summary>
<description>Содержит поля: id, name, parentLocation.</description>
</MODEL>
<MODEL id="model_statistics" file_ref="domain/src/main/java/com/homebox/lens/domain/model/Statistics.kt" status="implemented">
<summary>Модель статистики инвентаря.</summary>
<description>Содержит поля: totalItems, totalValue, locationsCount, labelsCount.</description>
</MODEL>
</DATA_MODELS>
<FEATURES> <FEATURES>
<FEATURE id="feat_dashboard" status="бэкенд_реализован"> <FEATURE id="feat_dashboard" status="implemented">
<summary>Экран панели управления</summary> <summary>Экран панели управления</summary>
<description>Отображает сводку по инвентарю, включая статистику, такую как общее количество товаров, общая стоимость и количество по местоположениям/меткам.</description> <description>Отображает сводку по инвентарю, включая статистику, такую как общее количество товаров, общая стоимость и количество по местоположениям/меткам.</description>
<UI_COMPONENT ref_id="screen_dashboard" /> <UI_COMPONENT ref_id="screen_dashboard" />
<FUNCTIONALITY> <FUNCTIONALITY>
<FUNCTION id="func_get_stats" status="реализовано"> <FUNCTION id="func_get_stats" status="implemented">
<summary>Получение и отображение статистики</summary> <summary>Получение и отображение статистики</summary>
<description>Получает общую статистику по инвентарю с сервера.</description> <description>Получает общую статистику по инвентарю с сервера.</description>
<precondition>Пользователь аутентифицирован; сеть доступна.</precondition>
<postcondition>Возвращает объект Statistics; данные кэшированы локально.</postcondition>
<implementation_ref id="uc_get_stats" /> <implementation_ref id="uc_get_stats" />
<implementation_note>Использован Flow для reactive обновлений; обработка ошибок через sealed class.</implementation_note>
</FUNCTION> </FUNCTION>
</FUNCTIONALITY> </FUNCTIONALITY>
</FEATURE> </FEATURE>
<FEATURE id="feat_inventory_list" status="бэкенд_реализован"> <FEATURE id="feat_inventory_list" status="implemented">
<summary>Экран списка инвентаря</summary> <summary>Экран списка инвентаря</summary>
<description>Отображает список всех инвентарных позиций с возможностью поиска и фильтрации.</description> <description>Отображает список всех инвентарных позиций с возможностью поиска и фильтрации.</description>
<UI_COMPONENT ref_id="screen_inventory_list" /> <UI_COMPONENT ref_id="screen_inventory_list" />
<FUNCTIONALITY> <FUNCTIONALITY>
<FUNCTION id="func_search_items" status="реализовано"> <FUNCTION id="func_search_items" status="implemented">
<summary>Поиск и фильтрация товаров</summary> <summary>Поиск и фильтрация товаров</summary>
<description>Ищет товары по строке запроса и фильтрам. Результаты разбиты на страницы.</description> <description>Ищет товары по строке запроса и фильтрам. Результаты разбиты на страницы.</description>
<precondition>Запрос не пустой; параметры пагинации валидны (page >= 1).</precondition>
<postcondition>Возвращает список Item с пагинацией; результаты отсортированы по релевантности.</postcondition>
<implementation_ref id="uc_search_items" /> <implementation_ref id="uc_search_items" />
<implementation_note>Поддержка фильтров по location/label; кэширование результатов для оффлайн.</implementation_note>
</FUNCTION> </FUNCTION>
<FUNCTION id="func_sync_inventory" status="реализовано"> <FUNCTION id="func_sync_inventory" status="implemented">
<summary>Синхронизация инвентаря</summary> <summary>Синхронизация инвентаря</summary>
<description>Выполняет полную синхронизацию локального кэша инвентаря с сервером.</description> <description>Выполняет полную синхронизацию локального кэша инвентаря с сервером.</description>
<precondition>Сеть доступна; пользователь аутентифицирован.</precondition>
<postcondition>Локальная БД обновлена; возвращает success/failure.</postcondition>
<implementation_ref id="uc_sync_inventory" /> <implementation_ref id="uc_sync_inventory" />
<implementation_note>Использует WorkManager для background sync; обработка конфликтов через last-modified.</implementation_note>
</FUNCTION> </FUNCTION>
</FUNCTIONALITY> </FUNCTIONALITY>
</FEATURE> </FEATURE>
<FEATURE id="feat_item_details" status="бэкенд_реализован"> <FEATURE id="feat_item_details" status="implemented">
<summary>Экран сведений о товаре</summary> <summary>Экран сведений о товаре</summary>
<description>Показывает все сведения о конкретном инвентарном товаре, включая его название, описание, изображения, вложения и настраиваемые поля.</description> <description>Показывает все сведения о конкретном инвентарном товаре, включая его название, описание, изображения, вложения и настраиваемые поля.</description>
<UI_COMPONENT ref_id="screen_item_details" /> <UI_COMPONENT ref_id="screen_item_details" />
<FUNCTIONALITY> <FUNCTIONALITY>
<FUNCTION id="func_get_item_details" status="реализовано"> <FUNCTION id="func_get_item_details" status="implemented">
<summary>Получение сведений о товаре</summary> <summary>Получение сведений о товаре</summary>
<description>Получает полные сведения о конкретном товаре из репозитория.</description> <description>Получает полные сведения о конкретном товаре из репозитория.</description>
<precondition>Item ID валиден и существует.</precondition>
<postcondition>Возвращает полный объект Item с attachments.</postcondition>
<implementation_ref id="uc_get_item_details" /> <implementation_ref id="uc_get_item_details" />
<implementation_note>Загрузка изображений через Coil; оффлайн-поддержка из Room.</implementation_note>
</FUNCTION> </FUNCTION>
</FUNCTIONALITY> </FUNCTIONALITY>
</FEATURE> </FEATURE>
<FEATURE id="feat_item_management" status="бэкенд_реализован"> <FEATURE id="feat_item_management" status="implemented">
<summary>Создание/редактирование/удаление товаров</summary> <summary>Создание/редактирование/удаление товаров</summary>
<description>Позволяет пользователям создавать новые товары, обновлять существующие и удалять их.</description> <description>Позволяет пользователям создавать новые товары, обновлять существующие и удалять их.</description>
<UI_COMPONENT ref_id="screen_item_edit" /> <UI_COMPONENT ref_id="screen_item_edit" />
<FUNCTIONALITY> <FUNCTIONALITY>
<FUNCTION id="func_create_item" status="реализовано"> <FUNCTION id="func_create_item" status="implemented">
<summary>Создать товар</summary> <summary>Создать товар</summary>
<description>Создает новый инвентарный товар на сервере.</description> <description>Создает новый инвентарный товар на сервере.</description>
<precondition>Все обязательные поля (name, quantity) заполнены; данные валидны.</precondition>
<postcondition>Новый Item сохранен на сервере; ID возвращен.</postcondition>
<implementation_ref id="uc_create_item" /> <implementation_ref id="uc_create_item" />
<implementation_note>Валидация через require; sync с локальной БД.</implementation_note>
</FUNCTION> </FUNCTION>
<FUNCTION id="func_update_item" status="реализовано"> <FUNCTION id="func_update_item" status="implemented">
<summary>Обновить товар</summary> <summary>Обновить товар</summary>
<description>Обновляет существующий инвентарный товар на сервере.</description> <description>Обновляет существующий инвентарный товар на сервере.</description>
<precondition>Item ID существует; изменения валидны.</precondition>
<postcondition>Item обновлен; версия инкрементирована.</postcondition>
<implementation_ref id="uc_update_item" /> <implementation_ref id="uc_update_item" />
<implementation_note>Partial update через PATCH; обработка concurrency.</implementation_note>
</FUNCTION> </FUNCTION>
<FUNCTION id="func_delete_item" status="реализовано"> <FUNCTION id="func_delete_item" status="implemented">
<summary>Удалить товар</summary> <summary>Удалить товар</summary>
<description>Удаляет инвентарный товар с сервера.</description> <description>Удаляет инвентарный товар с сервера.</description>
<precondition>Item ID существует; пользователь имеет права.</precondition>
<postcondition>Item удален; связанные ресурсы (attachments) очищены.</postcondition>
<implementation_ref id="uc_delete_item" /> <implementation_ref id="uc_delete_item" />
<implementation_note>Soft delete для восстановления; sync с локальной БД.</implementation_note>
</FUNCTION> </FUNCTION>
</FUNCTIONALITY> </FUNCTIONALITY>
</FEATURE> </FEATURE>
<FEATURE id="feat_labels_locations" status="бэкенд_реализован"> <FEATURE id="feat_labels_locations" status="implemented">
<summary>Управление метками и местоположениями</summary> <summary>Управление метками и местоположениями</summary>
<description>Позволяет пользователям просматривать списки всех доступных меток и местоположений.</description> <description>Позволяет пользователям просматривать списки всех доступных меток и местоположений.</description>
<UI_COMPONENT ref_id="screen_labels_list" /> <UI_COMPONENT ref_id="screen_labels_list" />
<UI_COMPONENT ref_id="screen_locations_list" /> <UI_COMPONENT ref_id="screen_locations_list" />
<FUNCTIONALITY> <FUNCTIONALITY>
<FUNCTION id="func_get_all_labels" status="реализовано"> <FUNCTION id="func_get_all_labels" status="implemented">
<summary>Получить все метки</summary> <summary>Получить все метки</summary>
<description>Получает список всех меток из репозитория.</description> <description>Получает список всех меток из репозитория.</description>
<precondition>Сеть доступна или кэш существует.</precondition>
<postcondition>Возвращает список Label; отсортирован по name.</postcondition>
<implementation_ref id="uc_get_all_labels" /> <implementation_ref id="uc_get_all_labels" />
<implementation_note>Кэширование в Room; reactive обновления.</implementation_note>
</FUNCTION> </FUNCTION>
<FUNCTION id="func_get_all_locations" status="реализовано"> <FUNCTION id="func_get_all_locations" status="implemented">
<summary>Получить все местоположения</summary> <summary>Получить все местоположения</summary>
<description>Получает список всех местоположений из репозитория.</description> <description>Получает список всех местоположений из репозитория.</description>
<precondition>Сеть доступна или кэш существует.</precondition>
<postcondition>Возвращает список Location; иерархическая структура сохранена.</postcondition>
<implementation_ref id="uc_get_all_locations" /> <implementation_ref id="uc_get_all_locations" />
<implementation_note>Поддержка nested locations; кэширование.</implementation_note>
</FUNCTION> </FUNCTION>
</FUNCTIONALITY> </FUNCTIONALITY>
</FEATURE> </FEATURE>
<FEATURE id="feat_search" status="бэкенд_реализован"> <FEATURE id="feat_search" status="implemented">
<summary>Экран поиска</summary> <summary>Экран поиска</summary>
<description>Предоставляет специальный пользовательский интерфейс для поиска товаров.</description> <description>Предоставляет специальный пользовательский интерфейс для поиска товаров.</description>
<UI_COMPONENT ref_id="screen_search" /> <UI_COMPONENT ref_id="screen_search" />
<FUNCTIONALITY> <FUNCTIONALITY>
<FUNCTION id="func_search_items_dedicated" status="реализовано"> <FUNCTION id="func_search_items_dedicated" status="implemented">
<summary>Поиск со специального экрана</summary> <summary>Поиск со специального экрана</summary>
<description>Использует ту же функцию поиска, но со специального экрана.</description> <description>Использует ту же функцию поиска, но со специального экрана.</description>
<precondition>Запрос не пустой.</precondition>
<postcondition>Возвращает результаты поиска; UI обновлен.</postcondition>
<implementation_ref id="uc_search_items" /> <implementation_ref id="uc_search_items" />
<implementation_note>Интеграция с SearchView; debounce для запросов.</implementation_note>
</FUNCTION> </FUNCTION>
</FUNCTIONALITY> </FUNCTIONALITY>
</FEATURE> </FEATURE>
</FEATURES> </FEATURES>
<UI_SPECIFICATIONS> <UI_SPECIFICATIONS>
<SCREEN id="screen_dashboard" status="defined"> <SCREEN id="screen_dashboard" status="implemented">
<summary>Главный экран "Панель управления"</summary> <summary>Главный экран "Панель управления"</summary>
<description> <description>
Экран предоставляет обзорную информацию и быстрый доступ к основным функциям. Компоновка должна быть чистой и интуитивно понятной, аналогично веб-интерфейсу HomeBox. Экран предоставляет обзорную информацию и быстрый доступ к основным функциям. Компоновка должна быть чистой и интуитивно понятной, аналогично веб-интерфейсу HomeBox.
@@ -186,10 +250,19 @@
</description> </description>
</COMPONENT> </COMPONENT>
</LAYOUT> </LAYOUT>
<USER_INTERACTIONS>
<INTERACTION>
<action>Нажатие на чип местоположения/метки</action>
<reaction>Навигация на экран списка инвентаря с фильтром.</reaction>
</INTERACTION>
<INTERACTION>
<action>Нажатие на кнопку "Создать"</action>
<reaction>Открытие экрана редактирования нового товара.</reaction>
</INTERACTION>
</USER_INTERACTIONS>
</SCREEN> </SCREEN>
<!-- [ЯКОРЬ] Начало спецификации UI для экрана Локаций. Добавлено на основе референса HomeBox. --> <SCREEN id="screen_locations_list" status="implemented">
<SCREEN id="screen_locations_list" status="defined">
<summary>Экран "Локации"</summary> <summary>Экран "Локации"</summary>
<description> <description>
Отображает вертикальный список всех доступных местоположений. Экран должен быть интегрирован в общую структуру навигации приложения (TopAppBar, NavigationDrawer). Отображает вертикальный список всех доступных местоположений. Экран должен быть интегрирован в общую структуру навигации приложения (TopAppBar, NavigationDrawer).
@@ -230,10 +303,8 @@
</INTERACTION> </INTERACTION>
</USER_INTERACTIONS> </USER_INTERACTIONS>
</SCREEN> </SCREEN>
<!-- [ЯКОРЬ] Конец спецификации UI для экрана Локаций. -->
<!-- [ЯКОРЬ] Начало спецификации UI для экрана Меток. --> <SCREEN id="screen_labels_list" status="implemented">
<SCREEN id="screen_labels_list" status="defined">
<summary>Экран "Метки"</summary> <summary>Экран "Метки"</summary>
<description> <description>
Отображает вертикальный список всех доступных меток. Экран должен быть интегрирован в общую структуру навигации приложения. Отображает вертикальный список всех доступных меток. Экран должен быть интегрирован в общую структуру навигации приложения.
@@ -268,7 +339,131 @@
</INTERACTION> </INTERACTION>
</USER_INTERACTIONS> </USER_INTERACTIONS>
</SCREEN> </SCREEN>
<!-- [ЯКОРЬ] Конец спецификации UI для экрана Меток. -->
<SCREEN id="screen_inventory_list" status="implemented">
<summary>Экран "Список инвентаря"</summary>
<description>
Отображает список всех инвентарных позиций с возможностью поиска, фильтрации и пагинации. Интегрирован в навигацию.
</description>
<LAYOUT>
<COMPONENT type="TopAppBar">
<description>Верхняя панель с поиском и фильтрами.</description>
</COMPONENT>
<COMPONENT type="MainContent" orientation="vertical" scrollable="true">
<description>Прокручиваемый список товаров.</description>
<SUB_COMPONENT type="List" name="InventoryList">
<description>LazyColumn с карточками товаров (name, quantity, location).</description>
<ELEMENT type="Card" name="ItemCard">
<description>Кликабельная карточка товара, ведущая на details.</description>
</ELEMENT>
</SUB_COMPONENT>
</COMPONENT>
<COMPONENT type="FloatingActionButton" icon="sync">
<description>Кнопка для синхронизации инвентаря.</description>
</COMPONENT>
</LAYOUT>
<USER_INTERACTIONS>
<INTERACTION>
<action>Ввод в поиск</action>
<reaction>Обновление списка с debounce.</reaction>
</INTERACTION>
<INTERACTION>
<action>Нажатие на товар</action>
<reaction>Навигация на screen_item_details.</reaction>
</INTERACTION>
</USER_INTERACTIONS>
</SCREEN>
<SCREEN id="screen_item_details" status="implemented">
<summary>Экран "Сведения о товаре"</summary>
<description>
Показывает детальную информацию о товаре, включая изображения и custom fields.
</description>
<LAYOUT>
<COMPONENT type="TopAppBar">
<description>С кнопками edit/delete.</description>
</COMPONENT>
<COMPONENT type="MainContent" orientation="vertical" scrollable="true">
<SUB_COMPONENT type="ImageCarousel" name="Images">
<description>Карусель изображений.</description>
</SUB_COMPONENT>
<SUB_COMPONENT type="DetailsSection" title="Описание">
<description>Текст description.</description>
</SUB_COMPONENT>
<SUB_COMPONENT type="FieldsGrid" name="CustomFields">
<description>Сетка custom полей.</description>
</SUB_COMPONENT>
</COMPONENT>
</LAYOUT>
<USER_INTERACTIONS>
<INTERACTION>
<action>Нажатие edit</action>
<reaction>Навигация на screen_item_edit.</reaction>
</INTERACTION>
<INTERACTION>
<action>Нажатие delete</action>
<reaction>Подтверждение и вызов func_delete_item.</reaction>
</INTERACTION>
</USER_INTERACTIONS>
</SCREEN>
<SCREEN id="screen_item_edit" status="implemented">
<summary>Экран "Редактирование товара"</summary>
<description>
Форма для создания/обновления товара с полями name, description, quantity, etc.
</description>
<LAYOUT>
<COMPONENT type="TopAppBar">
<description>С кнопкой save.</description>
</COMPONENT>
<COMPONENT type="MainContent" orientation="vertical" scrollable="true">
<SUB_COMPONENT type="TextField" name="Name">
<description>Поле ввода имени.</description>
</SUB_COMPONENT>
<SUB_COMPONENT type="Dropdown" name="Location">
<description>Выбор местоположения.</description>
</SUB_COMPONENT>
<SUB_COMPONENT type="ChipGroup" name="Labels">
<description>Выбор меток.</description>
</SUB_COMPONENT>
<SUB_COMPONENT type="ImagePicker" name="Images">
<description>Добавление изображений.</description>
</SUB_COMPONENT>
</COMPONENT>
</LAYOUT>
<USER_INTERACTIONS>
<INTERACTION>
<action>Нажатие save</action>
<reaction>Валидация и вызов func_create_item или func_update_item.</reaction>
</INTERACTION>
</USER_INTERACTIONS>
</SCREEN>
<SCREEN id="screen_search" status="implemented">
<summary>Экран "Поиск"</summary>
<description>
Специализированный экран для поиска с расширенными фильтрами.
</description>
<LAYOUT>
<COMPONENT type="TopAppBar">
<description>С поисковой строкой.</description>
</COMPONENT>
<COMPONENT type="MainContent" orientation="vertical">
<SUB_COMPONENT type="FilterSection" name="Filters">
<description>Чипы для фильтров (location, label).</description>
</SUB_COMPONENT>
<SUB_COMPONENT type="List" name="SearchResults">
<description>LazyColumn результатов.</description>
</SUB_COMPONENT>
</COMPONENT>
</LAYOUT>
<USER_INTERACTIONS>
<INTERACTION>
<action>Изменение запроса/фильтров</action>
<reaction>Обновление результатов.</reaction>
</INTERACTION>
</USER_INTERACTIONS>
</SCREEN>
</UI_SPECIFICATIONS> </UI_SPECIFICATIONS>