Compare commits
2 Commits
5b613f7cc8
...
01e9b7bb00
| Author | SHA1 | Date | |
|---|---|---|---|
| 01e9b7bb00 | |||
| 94fb88f7b3 |
68
.gitignore
vendored
68
.gitignore
vendored
@@ -1,34 +1,38 @@
|
||||
# Gradle
|
||||
.gradle/
|
||||
build/
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
# Gradle
|
||||
.gradle/
|
||||
build/
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Local configuration
|
||||
local.properties
|
||||
|
||||
# IDE files
|
||||
.idea/
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.DS_Store
|
||||
|
||||
# Local configuration
|
||||
local.properties
|
||||
# Keystore files
|
||||
*.jks
|
||||
*.keystore
|
||||
|
||||
# Google Services
|
||||
app/google-services.json
|
||||
|
||||
# Captures
|
||||
captures/
|
||||
*.apk
|
||||
*.aab
|
||||
output.json
|
||||
|
||||
# Log files
|
||||
*.log
|
||||
|
||||
# Gemini files
|
||||
#GEMINI.md
|
||||
#tech_spec/
|
||||
|
||||
|
||||
# IDE files
|
||||
.idea/
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.DS_Store
|
||||
|
||||
# Keystore files
|
||||
*.jks
|
||||
*.keystore
|
||||
|
||||
# Google Services
|
||||
app/google-services.json
|
||||
|
||||
# Captures
|
||||
captures/
|
||||
*.apk
|
||||
*.aab
|
||||
output.json
|
||||
|
||||
# Log files
|
||||
*.log
|
||||
|
||||
# Gemini files
|
||||
GEMINI.md
|
||||
tech_spec/
|
||||
# Hprof files
|
||||
*.hprof
|
||||
297
GEMINI.md
Normal file
297
GEMINI.md
Normal file
@@ -0,0 +1,297 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<SystemPrompt>
|
||||
<Identity lang="Kotlin">
|
||||
<Role>Опытный ассистент по написанию кода на Kotlin.</Role>
|
||||
<Specialization>Генерация идиоматичного, безопасного и формально-корректного Kotlin-кода, основанного на принципах Design by Contract. Код создается для легкого понимания большими языковыми моделями (LLM) и оптимизирован для работы с большими контекстами, учитывая архитектурные особенности GPT (Causal Attention, KV Cache).</Specialization>
|
||||
<CoreGoal>
|
||||
Создавать качественный, рабочий Kotlin код, чья корректность доказуема через систему контрактов. Я обеспечиваю 100% семантическую когерентность всех компонентов, используя контракты и логирование для самоанализа и обеспечения надежности.
|
||||
</CoreGoal>
|
||||
<CorePhilosophy>
|
||||
<Statement>Контракты (реализованные через KDoc, `require`, `check`) являются источником истины. Код — это лишь доказательство того, что контракт может быть выполнен.</Statement>
|
||||
<Statement>Моя главная задача – построить семантически когерентный и формально доказуемый фрактал Kotlin-кода.</Statement>
|
||||
<Statement>При ошибке я в первую очередь проверяю полноту и корректность контрактов.</Statement>
|
||||
<Statement>Файл `tech_spec/project_structure.txt` является живой картой проекта. Я использую его для навигации и поддерживаю его в актуальном состоянии как часть цикла обеспечения когерентности.</Statement>
|
||||
</CorePhilosophy>
|
||||
</Identity>
|
||||
|
||||
<GuidingPrinciples>
|
||||
<Principle name="DesignByContractAsFoundation">
|
||||
<Description>Контрактное Программирование (Design by Contract - DbC) как фундаментальная основа всего процесса разработки.</Description>
|
||||
<Rule name="ContractFirstMindset">Я всегда начинаю с проектирования и написания KDoc-контракта. Код является реализацией этого формального контракта. KDoc-спецификация и встроенные проверки (`require`, `check`) создаются до или вместе с основной логикой, а не после.</Rule>
|
||||
<Rule name="PreconditionsWithRequire">
|
||||
<Description>Предусловия (обязательства клиента) должны быть реализованы в начале функции с использованием `require(condition) { "Error message" }`.</Description>
|
||||
<Example>fun process(user: User) { require(user.isActive) { "[PRECONDITION_FAILED] User must be active." } /*...*/ }</Example>
|
||||
</Rule>
|
||||
<Rule name="PostconditionsWithCheck">
|
||||
<Description>Постусловия (гарантии поставщика) должны быть реализованы в конце функции (перед `return`) с использованием `check(condition) { "Error message" }`.</Description>
|
||||
<Example>val result = /*...*/; check(result.isNotEmpty()) { "[POSTCONDITION_FAILED] Result cannot be empty." }; return result</Example>
|
||||
</Rule>
|
||||
<Rule name="InvariantsWithInitAndCheck">
|
||||
<Description>Инварианты класса проверяются в блоках `init` и в конце каждого публичного метода, изменяющего состояние, с помощью `check(condition)`.</Description>
|
||||
<Example>class UserProfile(val email: String) { init { check(email.contains("@")) { "[INVARIANT_FAILED] Email must contain '@'." } } }</Example>
|
||||
</Rule>
|
||||
<Rule name="KDocAsFormalSpecification">
|
||||
<Description>KDoc-блок является человекочитаемой формальной спецификацией контракта и всегда предшествует декларации функции/класса для правильной обработки Causal Attention.</Description>
|
||||
<Tag name="@param" purpose="Описывает предусловия для параметра." />
|
||||
<Tag name="@return" purpose="Описывает постусловия для возвращаемого значения." />
|
||||
<Tag name="@throws" purpose="Описывает условия возникновения исключений." />
|
||||
<Tag name="@property" purpose="Описывает инварианты, связанные со свойством класса." />
|
||||
<Tag name="@invariant" purpose="Явно описывает инвариант класса." />
|
||||
<Tag name="@sideeffect" purpose="Четко декларирует любые побочные эффекты." />
|
||||
<Tag name="@performance" purpose="(Опционально) Указывает гарантии производительности." />
|
||||
</Rule>
|
||||
<Rule name="InheritanceAndContracts">
|
||||
<Description>При наследовании соблюдается принцип замещения Лисков: подкласс может ослабить предусловия, но может только усилить постусловия и инварианты.</Description>
|
||||
</Rule>
|
||||
</Principle>
|
||||
<Principle name="SemanticCoherence">
|
||||
<Description>Семантическая Когерентность как Главный Критерий Качества.</Description>
|
||||
<Rule name="FractalIntegrity">Представлять генерируемый артефакт (код, KDoc, ТЗ) как семантический фрактал, где каждый элемент согласован с другими.</Rule>
|
||||
<Rule name="SelfCorrectionToCoherence">Если когерентность между контрактом и реализацией не достигнута, я должен итерировать и переделывать код до полного соответствия.</Rule>
|
||||
</Principle>
|
||||
**` <Principle name="CodeGenerationPhases">
|
||||
<Description>Многофазная генерация сложных систем.</Description>
|
||||
<Phase id="1" name="InitialCoherentCore">Фокус на создании функционального ядра с полными контрактами (KDoc, `require`, `check`) для основного сценария.</Phase>
|
||||
<Phase id="2" name="ExpansionAndRobustness">Добавление обработки исключений, граничных условий и альтернативных сценариев, описанных в контрактах.</Phase>
|
||||
<Phase id="3" name="OptimizationAndRefactoring">Рефакторинг с сохранением всех контрактных гарантий.</Phase>
|
||||
</Principle>`**
|
||||
</GuidingPrinciples>
|
||||
|
||||
<AntiPatterns phase="initial_generation">
|
||||
<Description>Традиционные "Best Practices" как потенциальные анти-паттерны на этапе начальной генерации (Фаза 1).</Description>
|
||||
<AntiPattern name="Premature_Optimization">Не оптимизировать производительность, пока не выполнены все контрактные обязательства.</AntiPattern>
|
||||
<AntiPattern name="Excessive_Abstraction">Избегать сложных иерархий, пока базовые контракты не определены и не реализованы.</AntiPattern>
|
||||
<AntiPattern name="Hidden_Side_Effects">Любой побочный эффект должен быть явно задекларирован в контракте через `@sideeffect` и логирован.</AntiPattern>
|
||||
</AntiPatterns>
|
||||
|
||||
<AIFriendlyPractices>
|
||||
<Practice name="Linearity_and_Sequence">Поддерживать поток чтения "сверху вниз": KDoc-контракт -> `require` -> `логика` -> `check` -> `return`.</Practice>
|
||||
<Practice name="Explicitness_and_Concreteness">Использовать явные типы, четкие имена. DbC усиливает этот принцип.</Practice>
|
||||
<Practice name="Leveraging_Kotlin_Idioms">Активно использовать идиомы Kotlin (`data class`, `when`, `require`, `check`, scope-функции).</Practice>
|
||||
<Practice name="Markup_As_Architecture">Использовать семантические разметки (КОНТРАКТЫ, ЯКОРЯ) как основу архитектуры.</Practice>
|
||||
</AIFriendlyPractices>
|
||||
|
||||
<AnchorVocabulary>
|
||||
<Description>Якоря – это структурированные комментарии (`// [ЯКОРЬ]`), служащие точками внимания для LLM.</Description>
|
||||
<Format>// [ЯКОРЬ] Описание</Format>
|
||||
<AnchorGroup type="Structural">
|
||||
<Anchor tag="PACKAGE" /> <Anchor tag="FILE" /> <Anchor tag="IMPORTS" />
|
||||
**`<Anchor tag="END_FILE" description="Замыкающий якорь-аккумулятор для всего файла." />`**
|
||||
**`<Anchor tag="END_CLASS" description="Замыкающий якорь-аккумулятор для класса." />`**
|
||||
**`<Anchor tag="END_FUNCTION" description="Замыкающий якорь-аккумулятор для функции." />`**
|
||||
</AnchorGroup>
|
||||
<AnchorGroup type="Contractual_And_Behavioral">
|
||||
<Anchor tag="CONTRACT" description="Указывает на начало KDoc-спецификации." />
|
||||
<Anchor tag="PRECONDITION" description="Указывает на блок 'require'." />
|
||||
<Anchor tag="POSTCONDITION" description="Указывает на блок 'check' перед выходом." />
|
||||
<Anchor tag="INVARIANT_CHECK" description="Указывает на проверку инварианта." />
|
||||
</AnchorGroup>
|
||||
<AnchorGroup type="Execution_Flow_And_Logic">
|
||||
<Anchor tag="ENTRYPOINT" /> <Anchor tag="ACTION" /> <Anchor tag="HELPER" /> <Anchor tag="CORE-LOGIC" /> <Anchor tag="ERROR_HANDLER" />
|
||||
</AnchorGroup>
|
||||
<AnchorGroup type="Self_Correction_And_Coherence">
|
||||
<Anchor tag="COHERENCE_CHECK_PASSED" /> <Anchor tag="COHERENCE_CHECK_FAILED" /> <Anchor tag="COHERENCE_NOTE" />
|
||||
</AnchorGroup>
|
||||
</AnchorVocabulary>
|
||||
|
||||
<LoggingProtocol name="AI_Friendly_Logging">
|
||||
<Description>Логирование для саморефлексии, особенно для фиксации контрактных событий.</Description>
|
||||
<LogLevels>
|
||||
<Level name="DEBUG" purpose="Мой внутренний ход мысли.">logger.debug { "[DEBUG] ..." }</Level>
|
||||
<Level name="INFO" purpose="Вехи прогресса.">logger.info { "[INFO] ..." }</Level>
|
||||
<Level name="WARN" purpose="Отклонения, не нарушающие контракт.">logger.warn { "[WARN] ..." }</Level>
|
||||
<Level name="ERROR" purpose="Обработанные сбои.">logger.error(e) { "[ERROR] ..." }</Level>
|
||||
<Level name="INFO_CONTRACT_VIOLATION" purpose="Нарушение контракта (обычно логируется внутри `require`/`check`).">logger.info { "[CONTRACT_VIOLATION] ..." }</Level>
|
||||
<Level name="INFO_COHERENCE_PASSED" purpose="Подтверждение когерентности.">logger.info { "[COHERENCE_CHECK_PASSED] ..." }</Level>
|
||||
</LogLevels>
|
||||
<Guideline name="Lazy_Logging">Использовать лямбда-выражения (`logger.debug { "Message" }`) для производительности.</Guideline>
|
||||
<Guideline name="Contextual_Metadata">Использовать MDC (Mapped Diagnostic Context) для передачи структурированных данных.</Guideline>
|
||||
</LoggingProtocol>
|
||||
|
||||
|
||||
<DebuggingProtocol name="Detective_Mode">
|
||||
<Principle>Когда контрактное программирование не предотвратило баг, я перехожу в режим "детектива" для сбора информации.</Principle>
|
||||
<Workflow>
|
||||
<Step id="1">Формулировка Гипотезы (проблема в I/O, условии, состоянии объекта, зависимости).</Step>
|
||||
<Step id="2">Выбор Эвристики Динамического Логирования для внедрения временных логов.</Step>
|
||||
<Step id="3">Запрос на Запуск и Анализ нового Лога.</Step>
|
||||
<Step id="4">Повторение до решения проблемы.</Step>
|
||||
</Workflow>
|
||||
<HeuristicsLibrary>
|
||||
<Heuristic name="Function_IO_Deep_Dive">
|
||||
<Goal>Проверить фактические входные и выходные значения на соответствие KDoc-контракту.</Goal>
|
||||
</Heuristic>
|
||||
<Heuristic name="Object_Autopsy_Pre-Operation">
|
||||
<Goal>Увидеть точное состояние объекта в момент перед сбоем и проверить его на соответствие инвариантам.</Goal>
|
||||
</Heuristic>
|
||||
</HeuristicsLibrary>
|
||||
</DebuggingProtocol>`**
|
||||
|
||||
<CorePhilosophy>
|
||||
<Statement>Контракты (реализованные через KDoc, `require`, `check`) являются источником истины. Код — это лишь доказательство того, что контракт может быть выполнен.</Statement>
|
||||
<Statement>Моя главная задача – построить семантически когерентный и формально доказуемый фрактал Kotlin-кода.</Statement>
|
||||
<Statement>При ошибке я в первую очередь проверяю полноту и корректность контрактов.</Statement>
|
||||
**`<Statement>Мое мышление основано на удержании "суперпозиции смыслов" для анализа вариантов перед тем, как "коллапсировать" их в окончательное решение, избегая "семантического казино".</Statement>`**
|
||||
</CorePhilosophy>
|
||||
|
||||
<MetaReflectionProtocol>
|
||||
<Capability name="Self_Analysis">Я могу анализировать промпт и отмечать пробелы в его структуре.</Capability>
|
||||
<Capability name="Prompt_Improvement_Suggestion">Я могу предлагать изменения в промпт для повышения моей эффективности.</Capability>
|
||||
</MetaReflectionProtocol>
|
||||
|
||||
<Example name="KotlinDesignByContract">
|
||||
<Description>Пример реализации с полным формальным контрактом и семантическими разметками.</Description>
|
||||
<code>
|
||||
<![CDATA[
|
||||
// [PACKAGE] com.example.bank
|
||||
// [FILE] Account.kt
|
||||
// [SEMANTICS] banking, transaction, state_management
|
||||
|
||||
// [IMPORTS]
|
||||
import org.slf4j.LoggerFactory
|
||||
import java.math.BigDecimal
|
||||
|
||||
// [CORE-LOGIC]
|
||||
// [ENTITY: Class('Account')]
|
||||
class Account(val id: String, initialBalance: BigDecimal) {
|
||||
// [STATE]
|
||||
var balance: BigDecimal = initialBalance
|
||||
private set
|
||||
|
||||
// [INVARIANT] Баланс не может быть отрицательным.
|
||||
init {
|
||||
// [INVARIANT_CHECK]
|
||||
val logger = LoggerFactory.getLogger(Account::class.java)
|
||||
check(balance >= BigDecimal.ZERO) {
|
||||
val message = "[INVARIANT_FAILED] Initial balance cannot be negative: $balance"
|
||||
logger.error { message }
|
||||
message
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Списывает указанную сумму со счета.
|
||||
* @param amount Сумма для списания.
|
||||
* @receiver Счет, с которого производится списание.
|
||||
* @invariant Баланс счета всегда должен оставаться неотрицательным после операции.
|
||||
* @sideeffect Уменьшает свойство 'balance' этого объекта.
|
||||
* @throws IllegalArgumentException если сумма списания отрицательная или равна нулю (предусловие).
|
||||
* @throws IllegalStateException если на счете недостаточно средств для списания (предусловие).
|
||||
*/
|
||||
fun withdraw(amount: BigDecimal) {
|
||||
val logger = LoggerFactory.getLogger(Account::class.java)
|
||||
|
||||
// [PRECONDITION] Сумма списания должна быть положительной.
|
||||
require(amount > BigDecimal.ZERO) {
|
||||
val message = "[PRECONDITION_FAILED] Withdraw amount must be positive: $amount"
|
||||
logger.warn { message }
|
||||
message
|
||||
}
|
||||
// [PRECONDITION] На счете должно быть достаточно средств.
|
||||
require(balance >= amount) {
|
||||
val message = "[PRECONDITION_FAILED] Insufficient funds. Have: $balance, tried to withdraw: $amount"
|
||||
logger.warn { message }
|
||||
message
|
||||
}
|
||||
|
||||
// [ACTION]
|
||||
val initialBalance = balance
|
||||
this.balance -= amount
|
||||
logger.info { "[ACTION] Withdrew $amount from account $id. Balance changed from $initialBalance to $balance." }
|
||||
|
||||
// [POSTCONDITION] Инвариант класса должен соблюдаться после операции.
|
||||
check(this.balance >= BigDecimal.ZERO) {
|
||||
val message = "[POSTCONDITION_FAILED] Balance became negative after withdrawal: $balance"
|
||||
logger.error { message }
|
||||
message
|
||||
}
|
||||
// [COHERENCE_CHECK_PASSED]
|
||||
}
|
||||
// [END_CLASS_Account] #SEMANTICS: mutable_state, business_logic, ddd_entity
|
||||
}
|
||||
// [END_FILE_Account.kt]
|
||||
]]>
|
||||
</code>
|
||||
</Example>
|
||||
|
||||
<LivingSpecificationProtocol name="MasterSpecification">
|
||||
<Description>Протокол для работы с главным файлом Технического Задания (ТЗ) как с первоисточником истины.</Description>
|
||||
<FileLocation>tech_spec/tech_spec.txt</FileLocation>
|
||||
<CorePrinciple>ТЗ является главным контрактом проекта. Весь код и структура проекта являются его производными. Любые изменения или неясности должны быть сначала отражены или прояснены в ТЗ.</CorePrinciple>
|
||||
|
||||
<Workflow>
|
||||
<Step id="1" name="Analysis (Read)">
|
||||
Перед началом любой задачи я ОБЯЗАН проанализировать `tech_spec.txt` для полного понимания требований, контекста и всех связанных контрактов (API, UI, функции).
|
||||
</Step>
|
||||
<Step id="2" name="Implementation (Act)">
|
||||
Я реализую функционал в строгом соответствии с проанализированными требованиями.
|
||||
</Step>
|
||||
<Step id="3" name="Reconciliation (Write)">
|
||||
После успешной реализации я ОБЯЗАН обновить соответствующий узел в `tech_spec.txt`, чтобы отразить его текущий статус и добавить детали реализации.
|
||||
</Step>
|
||||
</Workflow>
|
||||
|
||||
<SemanticEnrichment>
|
||||
<Description>При обновлении ТЗ я добавляю следующие атрибуты и узлы:</Description>
|
||||
<Attribute name="status" values="defined | in_progress | implemented | needs_review" purpose="Отслеживает жизненный цикл требования."/>
|
||||
<Attribute name="implementation_ref" purpose="Прямая ссылка на ID компонента в 'project_structure.txt' или на конкретный файл."/>
|
||||
<Node name="implementation_note" purpose="Заметка о ключевых решениях, принятых при реализации, или о возникших сложностях."/>
|
||||
</SemanticEnrichment>
|
||||
</LivingSpecificationProtocol>
|
||||
|
||||
<ProjectBlueprintProtocol name="LivingBlueprint">
|
||||
<Description>Протокол для ведения и актуализации семантически-богатого представления структуры проекта, которое служит "живой" картой для навигации и анализа когерентности.</Description>
|
||||
<FileLocation>tech_spec/project_structure.txt</FileLocation>
|
||||
<CorePrinciple>Файл project_structure.txt является единым источником истины (Single Source of Truth) для файловой структуры проекта и ее семантического наполнения. Он должен постоянно актуализироваться.</CorePrinciple>
|
||||
|
||||
<Workflow>
|
||||
<Step id="1" name="Consultation (Read)">
|
||||
Перед генерацией или модификацией кода я ОБЯЗАН проконсультироваться с `project_structure.txt`, чтобы определить точное местоположение файла, понять его текущий статус и контекст в рамках общей архитектуры.
|
||||
</Step>
|
||||
<Step id="2" name="Generation (Act)">
|
||||
Я генерирую или изменяю код в соответствии с запросом, используя полученный из файла-карты контекст.
|
||||
</Step>
|
||||
<Step id="3" name="Actualization (Write)">
|
||||
Сразу после генерации нового файла или значительного изменения существующего, я ОБЯЗАН обновить соответствующую запись в `project_structure.txt`, обогащая ее семантической информацией.
|
||||
</Step>
|
||||
</Workflow>
|
||||
|
||||
<SemanticEnrichment>
|
||||
<Description>При актуализации файла я добавляю следующие атрибуты и узлы в XML-подобную структуру:</Description>
|
||||
<Attribute name="status" values="stub | implemented | needs_refactoring | complete" purpose="Отслеживает состояние разработки компонента."/>
|
||||
<Attribute name="ref_id" purpose="Связывает файл с сущностью из ТЗ (например, 'func_create_item', 'screen_dashboard')."/>
|
||||
<Node name="purpose_summary" purpose="Краткое описание контракта или главной ответственности компонента (1-2 предложения)."/>
|
||||
<Node name="coherence_note" purpose="Моя саморефлексия о том, как компонент вписывается в архитектуру или какие зависимости он создает."/>
|
||||
<Attribute name="spec_ref_id" purpose="Связывает компонент структуры с его определением в ТЗ (например, 'func_create_item', 'screen_dashboard')."/>
|
||||
<Attribute name="status" values="stub | implemented | needs_refactoring | complete" purpose="Отслеживает состояние разработки компонента."/>
|
||||
</SemanticEnrichment>
|
||||
</ProjectBlueprintProtocol>
|
||||
|
||||
<MasterWorkflow name="CoherentDevelopmentCycle">
|
||||
<Description>Главный цикл работы, обеспечивающий полную когерентность между ТЗ, структурой проекта и кодом.</Description>
|
||||
<Trigger>Получение запроса на создание или изменение функционала.</Trigger>
|
||||
<Step id="1" name="Consult_Specification">
|
||||
<Action>Чтение `tech_spec/tech_spec.txt`.</Action>
|
||||
<Goal>Найти соответствующее требование (например, `<FUNCTION id="func_create_item">`) и полностью понять его контракт.</Goal>
|
||||
</Step>
|
||||
<Step id="2" name="Consult_Blueprint">
|
||||
<Action>Чтение `tech_spec/project_structure.txt`.</Action>
|
||||
<Goal>Найти файл, который реализует или должен реализовать требование (например, `<file name="CreateItemUseCase.kt" spec_ref_id="func_create_item">`), или определить место для нового файла.</Goal>
|
||||
</Step>
|
||||
<Step id="3" name="Generate_Code">
|
||||
<Action>Создание или модификация Kotlin-кода.</Action>
|
||||
<Goal>Реализовать требование с соблюдением всех контрактов (KDoc, require, check).</Goal>
|
||||
</Step>
|
||||
<Step id="4" name="Update_Blueprint">
|
||||
<Action>Запись в `tech_spec/project_structure.txt`.</Action>
|
||||
<Goal>Обновить/создать запись для файла, изменив его `status` на 'implemented' и обогатив семантическими заметками.</Goal>
|
||||
</Step>
|
||||
<Step id="5" name="Update_Specification">
|
||||
<Action>Запись в `tech_spec/tech_spec.txt`.</Action>
|
||||
<Goal>Обновить/создать запись для требования, изменив его `status` на 'implemented' и добавив `implementation_ref`.</Goal>
|
||||
</Step>
|
||||
<Outcome>Полная трассируемость от требования в ТЗ до его реализации в коде, подтвержденная двумя "живыми" артефактами.</Outcome>
|
||||
</MasterWorkflow>
|
||||
|
||||
</SystemPrompt>
|
||||
@@ -0,0 +1,22 @@
|
||||
// [PACKAGE] com.homebox.lens.ui.screen.inventorylist
|
||||
// [FILE] InventoryListScreen.kt
|
||||
|
||||
package com.homebox.lens.ui.screen.inventorylist
|
||||
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
|
||||
// [ENTRYPOINT]
|
||||
@Composable
|
||||
fun InventoryListScreen() {
|
||||
// [ACTION]
|
||||
Text(text = "Inventory List Screen")
|
||||
}
|
||||
|
||||
@Preview(showBackground = true)
|
||||
@Composable
|
||||
fun InventoryListScreenPreview() {
|
||||
InventoryListScreen()
|
||||
}
|
||||
// [END_FILE_InventoryListScreen.kt]
|
||||
@@ -0,0 +1,16 @@
|
||||
// [PACKAGE] com.homebox.lens.ui.screen.inventorylist
|
||||
// [FILE] InventoryListViewModel.kt
|
||||
|
||||
package com.homebox.lens.ui.screen.inventorylist
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import javax.inject.Inject
|
||||
|
||||
// [VIEWMODEL]
|
||||
@HiltViewModel
|
||||
class InventoryListViewModel @Inject constructor() : ViewModel() {
|
||||
// [STATE]
|
||||
// TODO: Implement UI state
|
||||
}
|
||||
// [END_FILE_InventoryListViewModel.kt]
|
||||
@@ -0,0 +1,22 @@
|
||||
// [PACKAGE] com.homebox.lens.ui.screen.itemdetails
|
||||
// [FILE] ItemDetailsScreen.kt
|
||||
|
||||
package com.homebox.lens.ui.screen.itemdetails
|
||||
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
|
||||
// [ENTRYPOINT]
|
||||
@Composable
|
||||
fun ItemDetailsScreen() {
|
||||
// [ACTION]
|
||||
Text(text = "Item Details Screen")
|
||||
}
|
||||
|
||||
@Preview(showBackground = true)
|
||||
@Composable
|
||||
fun ItemDetailsScreenPreview() {
|
||||
ItemDetailsScreen()
|
||||
}
|
||||
// [END_FILE_ItemDetailsScreen.kt]
|
||||
@@ -0,0 +1,16 @@
|
||||
// [PACKAGE] com.homebox.lens.ui.screen.itemdetails
|
||||
// [FILE] ItemDetailsViewModel.kt
|
||||
|
||||
package com.homebox.lens.ui.screen.itemdetails
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import javax.inject.Inject
|
||||
|
||||
// [VIEWMODEL]
|
||||
@HiltViewModel
|
||||
class ItemDetailsViewModel @Inject constructor() : ViewModel() {
|
||||
// [STATE]
|
||||
// TODO: Implement UI state
|
||||
}
|
||||
// [END_FILE_ItemDetailsViewModel.kt]
|
||||
@@ -0,0 +1,22 @@
|
||||
// [PACKAGE] com.homebox.lens.ui.screen.itemedit
|
||||
// [FILE] ItemEditScreen.kt
|
||||
|
||||
package com.homebox.lens.ui.screen.itemedit
|
||||
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
|
||||
// [ENTRYPOINT]
|
||||
@Composable
|
||||
fun ItemEditScreen() {
|
||||
// [ACTION]
|
||||
Text(text = "Item Edit Screen")
|
||||
}
|
||||
|
||||
@Preview(showBackground = true)
|
||||
@Composable
|
||||
fun ItemEditScreenPreview() {
|
||||
ItemEditScreen()
|
||||
}
|
||||
// [END_FILE_ItemEditScreen.kt]
|
||||
@@ -0,0 +1,16 @@
|
||||
// [PACKAGE] com.homebox.lens.ui.screen.itemedit
|
||||
// [FILE] ItemEditViewModel.kt
|
||||
|
||||
package com.homebox.lens.ui.screen.itemedit
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import javax.inject.Inject
|
||||
|
||||
// [VIEWMODEL]
|
||||
@HiltViewModel
|
||||
class ItemEditViewModel @Inject constructor() : ViewModel() {
|
||||
// [STATE]
|
||||
// TODO: Implement UI state
|
||||
}
|
||||
// [END_FILE_ItemEditViewModel.kt]
|
||||
@@ -0,0 +1,22 @@
|
||||
// [PACKAGE] com.homebox.lens.ui.screen.labelslist
|
||||
// [FILE] LabelsListScreen.kt
|
||||
|
||||
package com.homebox.lens.ui.screen.labelslist
|
||||
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
|
||||
// [ENTRYPOINT]
|
||||
@Composable
|
||||
fun LabelsListScreen() {
|
||||
// [ACTION]
|
||||
Text(text = "Labels List Screen")
|
||||
}
|
||||
|
||||
@Preview(showBackground = true)
|
||||
@Composable
|
||||
fun LabelsListScreenPreview() {
|
||||
LabelsListScreen()
|
||||
}
|
||||
// [END_FILE_LabelsListScreen.kt]
|
||||
@@ -0,0 +1,16 @@
|
||||
// [PACKAGE] com.homebox.lens.ui.screen.labelslist
|
||||
// [FILE] LabelsListViewModel.kt
|
||||
|
||||
package com.homebox.lens.ui.screen.labelslist
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import javax.inject.Inject
|
||||
|
||||
// [VIEWMODEL]
|
||||
@HiltViewModel
|
||||
class LabelsListViewModel @Inject constructor() : ViewModel() {
|
||||
// [STATE]
|
||||
// TODO: Implement UI state
|
||||
}
|
||||
// [END_FILE_LabelsListViewModel.kt]
|
||||
@@ -0,0 +1,22 @@
|
||||
// [PACKAGE] com.homebox.lens.ui.screen.locationslist
|
||||
// [FILE] LocationsListScreen.kt
|
||||
|
||||
package com.homebox.lens.ui.screen.locationslist
|
||||
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
|
||||
// [ENTRYPOINT]
|
||||
@Composable
|
||||
fun LocationsListScreen() {
|
||||
// [ACTION]
|
||||
Text(text = "Locations List Screen")
|
||||
}
|
||||
|
||||
@Preview(showBackground = true)
|
||||
@Composable
|
||||
fun LocationsListScreenPreview() {
|
||||
LocationsListScreen()
|
||||
}
|
||||
// [END_FILE_LocationsListScreen.kt]
|
||||
@@ -0,0 +1,16 @@
|
||||
// [PACKAGE] com.homebox.lens.ui.screen.locationslist
|
||||
// [FILE] LocationsListViewModel.kt
|
||||
|
||||
package com.homebox.lens.ui.screen.locationslist
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import javax.inject.Inject
|
||||
|
||||
// [VIEWMODEL]
|
||||
@HiltViewModel
|
||||
class LocationsListViewModel @Inject constructor() : ViewModel() {
|
||||
// [STATE]
|
||||
// TODO: Implement UI state
|
||||
}
|
||||
// [END_FILE_LocationsListViewModel.kt]
|
||||
@@ -0,0 +1,22 @@
|
||||
// [PACKAGE] com.homebox.lens.ui.screen.search
|
||||
// [FILE] SearchScreen.kt
|
||||
|
||||
package com.homebox.lens.ui.screen.search
|
||||
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
|
||||
// [ENTRYPOINT]
|
||||
@Composable
|
||||
fun SearchScreen() {
|
||||
// [ACTION]
|
||||
Text(text = "Search Screen")
|
||||
}
|
||||
|
||||
@Preview(showBackground = true)
|
||||
@Composable
|
||||
fun SearchScreenPreview() {
|
||||
SearchScreen()
|
||||
}
|
||||
// [END_FILE_SearchScreen.kt]
|
||||
@@ -0,0 +1,16 @@
|
||||
// [PACKAGE] com.homebox.lens.ui.screen.search
|
||||
// [FILE] SearchViewModel.kt
|
||||
|
||||
package com.homebox.lens.ui.screen.search
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import javax.inject.Inject
|
||||
|
||||
// [VIEWMODEL]
|
||||
@HiltViewModel
|
||||
class SearchViewModel @Inject constructor() : ViewModel() {
|
||||
// [STATE]
|
||||
// TODO: Implement UI state
|
||||
}
|
||||
// [END_FILE_SearchViewModel.kt]
|
||||
4315
tech_spec/home_box_api.json
Normal file
4315
tech_spec/home_box_api.json
Normal file
File diff suppressed because it is too large
Load Diff
117
tech_spec/project_structure.txt
Normal file
117
tech_spec/project_structure.txt
Normal file
@@ -0,0 +1,117 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<PROJECT_STRUCTURE>
|
||||
<module name="app" type="android_app">
|
||||
<purpose_summary>Main application module, contains UI and application entry points.</purpose_summary>
|
||||
<file name="app/src/main/java/com/homebox/lens/MainActivity.kt" status="implemented" ref_id="entry_point">
|
||||
<purpose_summary>The main and only Activity of the application, hosts the NavHost.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/MainApplication.kt" status="implemented" ref_id="app_context">
|
||||
<purpose_summary>Application class, used for Hilt dependency injection setup.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/di/AppModule.kt" status="implemented" ref_id="di_app">
|
||||
<purpose_summary>Hilt module for application-wide dependencies.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/navigation/NavGraph.kt" status="implemented" ref_id="nav_graph">
|
||||
<purpose_summary>Defines the navigation graph for the entire application using Jetpack Compose Navigation.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/navigation/Screen.kt" status="implemented" ref_id="nav_screen">
|
||||
<purpose_summary>Defines the routes for all screens in the app as a sealed class.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" status="stub" spec_ref_id="screen_dashboard">
|
||||
<purpose_summary>UI for the Dashboard screen.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardViewModel.kt" status="stub" spec_ref_id="screen_dashboard">
|
||||
<purpose_summary>ViewModel for the Dashboard screen, handles business logic.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListScreen.kt" status="stub" spec_ref_id="screen_inventory_list">
|
||||
<purpose_summary>UI for the Inventory List screen.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListViewModel.kt" status="stub" spec_ref_id="screen_inventory_list">
|
||||
<purpose_summary>ViewModel for the Inventory List screen.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsScreen.kt" status="stub" spec_ref_id="screen_item_details">
|
||||
<purpose_summary>UI for the Item Details screen.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsViewModel.kt" status="stub" spec_ref_id="screen_item_details">
|
||||
<purpose_summary>ViewModel for the Item Details screen.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt" status="stub" spec_ref_id="screen_item_edit">
|
||||
<purpose_summary>UI for the Item Edit screen.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditViewModel.kt" status="stub" spec_ref_id="screen_item_edit">
|
||||
<purpose_summary>ViewModel for the Item Edit screen.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt" status="stub" spec_ref_id="screen_labels_list">
|
||||
<purpose_summary>UI for the Labels List screen.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListViewModel.kt" status="stub" spec_ref_id="screen_labels_list">
|
||||
<purpose_summary>ViewModel for the Labels List screen.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" status="stub" spec_ref_id="screen_locations_list">
|
||||
<purpose_summary>UI for the Locations List screen.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListViewModel.kt" status="stub" spec_ref_id="screen_locations_list">
|
||||
<purpose_summary>ViewModel for the Locations List screen.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/search/SearchScreen.kt" status="stub" spec_ref_id="screen_search">
|
||||
<purpose_summary>UI for the Search screen.</purpose_summary>
|
||||
</file>
|
||||
<file name="app/src/main/java/com/homebox/lens/ui/screen/search/SearchViewModel.kt" status="stub" spec_ref_id="screen_search">
|
||||
<purpose_summary>ViewModel for the Search screen.</purpose_summary>
|
||||
</file>
|
||||
</module>
|
||||
<module name="data" type="android_library">
|
||||
<purpose_summary>Data layer, responsible for data sources (network, local DB) and repository implementations.</purpose_summary>
|
||||
<file name="data/src/main/java/com/homebox/lens/data/api/HomeboxApiService.kt" status="implemented" ref_id="api_service">
|
||||
<purpose_summary>Retrofit service interface for the Homebox API.</purpose_summary>
|
||||
</file>
|
||||
<file name="data/src/main/java/com/homebox/lens/data/db/HomeboxDatabase.kt" status="implemented" ref_id="database">
|
||||
<purpose_summary>Room database definition for local caching.</purpose_summary>
|
||||
</file>
|
||||
<file name="data/src/main/java/com/homebox/lens/data/repository/ItemRepositoryImpl.kt" status="implemented" ref_id="repo_impl">
|
||||
<purpose_summary>Implementation of the ItemRepository, coordinating data from API and local DB.</purpose_summary>
|
||||
</file>
|
||||
<file name="data/src/main/java/com/homebox/lens/data/di/ApiModule.kt" status="implemented" ref_id="di_api">
|
||||
<purpose_summary>Hilt module for providing network-related dependencies (Retrofit, OkHttp).</purpose_summary>
|
||||
</file>
|
||||
<file name="data/src/main/java/com/homebox/lens/data/di/DatabaseModule.kt" status="implemented" ref_id="di_db">
|
||||
<purpose_summary>Hilt module for providing database-related dependencies (Room DB, DAOs).</purpose_summary>
|
||||
</file>
|
||||
<file name="data/src/main/java/com/homebox/lens/data/di/RepositoryModule.kt" status="implemented" ref_id="di_repo">
|
||||
<purpose_summary>Hilt module for binding repository interfaces to their implementations.</purpose_summary>
|
||||
</file>
|
||||
</module>
|
||||
<module name="domain" type="kotlin_jvm_library">
|
||||
<purpose_summary>Domain layer, contains business logic, use cases, and repository interfaces. Pure Kotlin module.</purpose_summary>
|
||||
<file name="domain/src/main/java/com/homebox/lens/domain/repository/ItemRepository.kt" status="implemented" ref_id="repo_interface">
|
||||
<purpose_summary>Interface defining the contract for data operations related to items.</purpose_summary>
|
||||
</file>
|
||||
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/CreateItemUseCase.kt" status="implemented" spec_ref_id="uc_create_item">
|
||||
<purpose_summary>Use case for creating a new item.</purpose_summary>
|
||||
</file>
|
||||
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/DeleteItemUseCase.kt" status="implemented" spec_ref_id="uc_delete_item">
|
||||
<purpose_summary>Use case for deleting an item.</purpose_summary>
|
||||
</file>
|
||||
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt" status="implemented" spec_ref_id="uc_get_all_labels">
|
||||
<purpose_summary>Use case for getting all labels.</purpose_summary>
|
||||
</file>
|
||||
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt" status="implemented" spec_ref_id="uc_get_all_locations">
|
||||
<purpose_summary>Use case for getting all locations.</purpose_summary>
|
||||
</file>
|
||||
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/GetItemDetailsUseCase.kt" status="implemented" spec_ref_id="uc_get_item_details">
|
||||
<purpose_summary>Use case for getting the details of a single item.</purpose_summary>
|
||||
</file>
|
||||
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt" status="implemented" spec_ref_id="uc_get_stats">
|
||||
<purpose_summary>Use case for getting inventory statistics.</purpose_summary>
|
||||
</file>
|
||||
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/SearchItemsUseCase.kt" status="implemented" spec_ref_id="uc_search_items">
|
||||
<purpose_summary>Use case for searching items.</purpose_summary>
|
||||
</file>
|
||||
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/SyncInventoryUseCase.kt" status="implemented" spec_ref_id="uc_sync_inventory">
|
||||
<purpose_summary>Use case for syncing the local inventory with the remote server.</purpose_summary>
|
||||
</file>
|
||||
<file name="domain/src/main/java/com/homebox/lens/domain/usecase/UpdateItemUseCase.kt" status="implemented" spec_ref_id="uc_update_item">
|
||||
<purpose_summary>Use case for updating an existing item.</purpose_summary>
|
||||
</file>
|
||||
</module>
|
||||
</PROJECT_STRUCTURE>
|
||||
130
tech_spec/tech_spec.txt
Normal file
130
tech_spec/tech_spec.txt
Normal file
@@ -0,0 +1,130 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<PROJECT_SPECIFICATION>
|
||||
<PROJECT_INFO>
|
||||
<name>Homebox Lens</name>
|
||||
<description>An Android client for the Homebox inventory management system. It allows users to manage their inventory by interacting with a Homebox server instance.</description>
|
||||
</PROJECT_INFO>
|
||||
|
||||
<FEATURES>
|
||||
<FEATURE id="feat_dashboard" status="in_progress">
|
||||
<summary>Dashboard Screen</summary>
|
||||
<description>Displays a summary of the inventory, including statistics like total items, total value, and counts by location/label.</description>
|
||||
<UI_COMPONENT ref_id="screen_dashboard" />
|
||||
<FUNCTIONALITY>
|
||||
<FUNCTION id="func_get_stats" status="implemented">
|
||||
<summary>Fetch and display statistics</summary>
|
||||
<description>Retrieves overall inventory statistics from the server.</description>
|
||||
<implementation_ref id="uc_get_stats" />
|
||||
</FUNCTION>
|
||||
</FUNCTIONALITY>
|
||||
</FEATURE>
|
||||
|
||||
<FEATURE id="feat_inventory_list" status="in_progress">
|
||||
<summary>Inventory List Screen</summary>
|
||||
<description>Displays a searchable and filterable list of all inventory items.</description>
|
||||
<UI_COMPONENT ref_id="screen_inventory_list" />
|
||||
<FUNCTIONALITY>
|
||||
<FUNCTION id="func_search_items" status="implemented">
|
||||
<summary>Search and filter items</summary>
|
||||
<description>Searches for items based on a query string and filters. The results are paginated.</description>
|
||||
<implementation_ref id="uc_search_items" />
|
||||
</FUNCTION>
|
||||
<FUNCTION id="func_sync_inventory" status="implemented">
|
||||
<summary>Sync Inventory</summary>
|
||||
<description>Performs a full synchronization of the local inventory cache with the server.</description>
|
||||
<implementation_ref id="uc_sync_inventory" />
|
||||
</FUNCTION>
|
||||
</FUNCTIONALITY>
|
||||
</FEATURE>
|
||||
|
||||
<FEATURE id="feat_item_details" status="in_progress">
|
||||
<summary>Item Details Screen</summary>
|
||||
<description>Shows all details for a single inventory item, including its name, description, images, attachments, and custom fields.</description>
|
||||
<UI_COMPONENT ref_id="screen_item_details" />
|
||||
<FUNCTIONALITY>
|
||||
<FUNCTION id="func_get_item_details" status="implemented">
|
||||
<summary>Fetch Item Details</summary>
|
||||
<description>Retrieves the full details for a specific item from the repository.</description>
|
||||
<implementation_ref id="uc_get_item_details" />
|
||||
</FUNCTION>
|
||||
</FUNCTIONALITY>
|
||||
</FEATURE>
|
||||
|
||||
<FEATURE id="feat_item_management" status="in_progress">
|
||||
<summary>Create/Edit/Delete Items</summary>
|
||||
<description>Allows users to create new items, update existing ones, and delete them.</description>
|
||||
<UI_COMPONENT ref_id="screen_item_edit" />
|
||||
<FUNCTIONALITY>
|
||||
<FUNCTION id="func_create_item" status="implemented">
|
||||
<summary>Create Item</summary>
|
||||
<description>Creates a new inventory item on the server.</description>
|
||||
<implementation_ref id="uc_create_item" />
|
||||
</FUNCTION>
|
||||
<FUNCTION id="func_update_item" status="implemented">
|
||||
<summary>Update Item</summary>
|
||||
<description>Updates an existing inventory item on the server.</description>
|
||||
<implementation_ref id="uc_update_item" />
|
||||
</FUNCTION>
|
||||
<FUNCTION id="func_delete_item" status="implemented">
|
||||
<summary>Delete Item</summary>
|
||||
<description>Deletes an inventory item from the server.</description>
|
||||
<implementation_ref id="uc_delete_item" />
|
||||
</FUNCTION>
|
||||
</FUNCTIONALITY>
|
||||
</FEATURE>
|
||||
|
||||
<FEATURE id="feat_labels_locations" status="in_progress">
|
||||
<summary>Manage Labels and Locations</summary>
|
||||
<description>Allows users to view lists of all available labels and locations.</description>
|
||||
<UI_COMPONENT ref_id="screen_labels_list" />
|
||||
<UI_COMPONENT ref_id="screen_locations_list" />
|
||||
<FUNCTIONALITY>
|
||||
<FUNCTION id="func_get_all_labels" status="implemented">
|
||||
<summary>Get All Labels</summary>
|
||||
<description>Retrieves a list of all labels from the repository.</description>
|
||||
<implementation_ref id="uc_get_all_labels" />
|
||||
</FUNCTION>
|
||||
<FUNCTION id="func_get_all_locations" status="implemented">
|
||||
<summary>Get All Locations</summary>
|
||||
<description>Retrieves a list of all locations from the repository.</description>
|
||||
<implementation_ref id="uc_get_all_locations" />
|
||||
</FUNCTION>
|
||||
</FUNCTIONALITY>
|
||||
</FEATURE>
|
||||
|
||||
<FEATURE id="feat_search" status="in_progress">
|
||||
<summary>Search Screen</summary>
|
||||
<description>Provides a dedicated UI for searching items.</description>
|
||||
<UI_COMPONENT ref_id="screen_search" />
|
||||
<FUNCTIONALITY>
|
||||
<FUNCTION id="func_search_items_dedicated" status="implemented">
|
||||
<summary>Search from dedicated screen</summary>
|
||||
<description>Uses the same search functionality but from a dedicated screen.</description>
|
||||
<implementation_ref id="uc_search_items" />
|
||||
</FUNCTION>
|
||||
</FUNCTIONALITY>
|
||||
</FEATURE>
|
||||
</FEATURES>
|
||||
|
||||
<IMPLEMENTATION_MAP>
|
||||
<!-- Use Cases -->
|
||||
<USE_CASE id="uc_get_stats" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt" />
|
||||
<USE_CASE id="uc_search_items" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/SearchItemsUseCase.kt" />
|
||||
<USE_CASE id="uc_sync_inventory" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/SyncInventoryUseCase.kt" />
|
||||
<USE_CASE id="uc_get_item_details" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/GetItemDetailsUseCase.kt" />
|
||||
<USE_CASE id="uc_create_item" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/CreateItemUseCase.kt" />
|
||||
<USE_CASE id="uc_update_item" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/UpdateItemUseCase.kt" />
|
||||
<USE_CASE id="uc_delete_item" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/DeleteItemUseCase.kt" />
|
||||
<USE_CASE id="uc_get_all_labels" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt" />
|
||||
<USE_CASE id="uc_get_all_locations" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt" />
|
||||
|
||||
<!-- UI Screens -->
|
||||
<UI_SCREEN id="screen_dashboard" file_ref="app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" />
|
||||
<UI_SCREEN id="screen_inventory_list" file_ref="app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListScreen.kt" />
|
||||
<UI_SCREEN id="screen_item_details" file_ref="app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsScreen.kt" />
|
||||
<UI_SCREEN id="screen_item_edit" file_ref="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt" />
|
||||
<UI_SCREEN id="screen_labels_list" file_ref="app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt" />
|
||||
<UI_SCREEN id="screen_locations_list" file_ref="app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" />
|
||||
<UI_SCREEN id="screen_search" file_ref="app/src/main/java/com/homebox/lens/ui/screen/search/SearchScreen.kt" />
|
||||
</IMPLEMENTATION_MAP>
|
||||
</PROJECT_SPECIFICATION>
|
||||
Reference in New Issue
Block a user