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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 24 additions & 6 deletions PROJECT.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

> Нормативная спецификация для реализации Windows-приложения на C# + .NET + WinUI 3 + Windows App SDK + SQLite.

> Текущее устройство хранения описано в `docs/architecture.md`; требования к будущим возможностям остаются в этой спецификации.

## 0. Как Codex должен использовать этот документ

Этот файл является исходным продуктовым и техническим контрактом проекта. При конфликте с предположениями, примерами, шаблонным кодом или неявными решениями приоритет имеют требования этого файла.
Expand Down Expand Up @@ -348,7 +350,18 @@ Visual resolution MUST поддерживать приоритет:
- Startup impact MUST быть минимальным: database migrations и загрузка первого экрана не должны блокировать UI thread.
- Автозапуск с Windows MAY быть добавлен после MVP; он MUST быть opt-in.

## 7. Persistence: SQLite + filesystem assets
## 7. Persistence: portable SQLite + filesystem assets

### 7.0 Portable data directory and configuration

- Приложение MUST запускаться как portable из распакованного каталога без установки и хранить пользовательские данные по умолчанию в подкаталоге `content` рядом с исполняемым файлом (`AppContext.BaseDirectory/content`), независимо от текущего каталога процесса.
- В `content` MUST находиться БД и весь app-owned контент: пользовательские assets, thumbnails/cache и другие создаваемые приложением файлы. Внутренние ссылки на assets MUST быть относительными к корню данных, чтобы каталог можно было переносить вместе с приложением или отдельно от него.
- Единственный параметр вне БД, который MAY сохраняться между запусками, — путь к каталогу данных. Он MUST храниться в `portable-config.json` рядом с исполняемым файлом в поле `dataDirectory`. JSON MUST NOT содержать иных пользовательских настроек или копий данных из БД.
- Путь к каталогу данных MAY явно задаваться параметром командной строки `--data-dir <path>` или переменной окружения `PERSONAL_RESOURCE_WORKSPACE_DATA_DIR`. Приоритет источников MUST быть: параметр командной строки → переменная окружения → JSON-конфигурация → `content` рядом с исполняемым файлом. Неизвестные/ошибочные значения MUST давать понятную ошибку, а не молча открывать другой каталог.
- Относительный путь из любого источника MUST разрешаться относительно каталога исполняемого файла, а не текущего каталога процесса. Перед открытием БД приложение MUST нормализовать путь и проверять доступность каталога и возможность записи; при ошибке MUST сохранить пользовательские данные и предложить исправить путь.
- Форма «Настройки» MUST показывать эффективный каталог данных и источник выбора (параметр, окружение, JSON или default), позволять выбрать другой каталог и явно объяснять, когда параметр командной строки или переменная окружения переопределяют сохранённый выбор. При изменении из формы новый путь MUST записываться в JSON-конфигурацию; внешние overrides форма MUST NOT изменять.
- Смена каталога через форму MUST переносить рабочее пространство целиком: БД с согласованным snapshot/backup, app-owned assets и другие необходимые файлы. MUST проверяться свободное место, доступность записи и целостность результата; существующие данные в целевом каталоге MUST NOT перезаписываться без явного выбора пользователя. Переключение на новый каталог MUST происходить только после успешного копирования и проверки, с безопасным закрытием/повторным открытием БД либо перезапуском приложения. При ошибке MUST сохраняться прежний рабочий каталог и его содержимое; прежние данные MUST NOT удаляться автоматически.
- Переход с существующего `%LOCALAPPDATA%/PersonalResourceWorkspace` на portable layout MUST сохранять текущую БД, визуальные файлы и настройки. При первом запуске после обновления, если выбранный каталог данных пуст, приложение MUST автоматически скопировать и проверить существующее рабочее пространство; при непустом каталоге MUST запросить выбор без неявного слияния/перезаписи. Исходные данные MUST сохраняться до подтверждённого успешного запуска из нового каталога. Режим вида из `Settings/collection-view.txt` MUST мигрировать в БД.

### 7.1 Storage responsibilities

Expand All @@ -359,7 +372,7 @@ SQLite MUST хранить:
- membership/placement и ordering;
- action configuration/overrides, если они пользовательские;
- asset metadata;
- settings, необходимые для согласованности данных;
- все пользовательские настройки, включая режим вида, сортировку и будущие параметры интерфейса/поведения; исключение — только путь к каталогу данных, необходимый до открытия БД;
- schema migration history.

Filesystem MUST хранить:
Expand All @@ -371,6 +384,8 @@ Filesystem MUST хранить:

SQLite MUST NOT использоваться как безразмерное хранилище крупных image blobs в MVP.

Каждая новая пользовательская настройка MUST иметь запись/миграцию в БД и доступный элемент формы «Настройки» в той же поставке. Разрозненные файлы настроек вне БД MUST NOT создаваться. Значения по умолчанию MUST быть определены и применяться при отсутствующей записи; изменения MUST сохраняться после перезапуска.

### 7.2 Data integrity

- Схема MUST иметь foreign keys, indexes и constraints для основных инвариантов.
Expand Down Expand Up @@ -479,8 +494,8 @@ Dependency direction MUST быть направлен к Domain/Application. Dom

## 10. Deployment model

- Начальная реализация SHOULD использовать **packaged** WinUI 3 app как стандартный, Store-friendly путь с package identity.
- Если обязательным становится прямой agent-driven запуск `.exe` без deployment, решение MAY перейти на **unpackaged**, но изменение MUST быть оформлено архитектурным решением и учесть Windows App SDK bootstrap/runtime initialization, storage и activation differences.
- Целевая поставка MUST быть **portable unpackaged** WinUI 3 app: распаковка и запуск `.exe` без installer/MSIX, при сохранении требований Windows App SDK к runtime/bootstrap и минимальной версии Windows.
- Portable-архив MUST включать все необходимые файлы приложения; каталог `content` MUST создаваться при первом запуске, если выбранный каталог данных пуст.
- Код MUST NOT неявно смешивать packaged и unpackaged assumptions.
- Конкретные версии .NET, Windows App SDK и NuGet packages MUST быть централизованы и закреплены на поддерживаемых стабильных версиях на момент bootstrap проекта.
- Минимальная поддерживаемая Windows version MUST быть явно задана в проекте и README; baseline MUST соответствовать требованиям выбранной версии Windows App SDK.
Expand Down Expand Up @@ -666,7 +681,7 @@ MVP MUST NOT включать:
### Phase 1 — Domain and persistence vertical slice

- Реализовать Resource, Collection, Placement, typed payloads и action contracts.
- Реализовать SQLite connection factory, migrations, repositories и filesystem asset store.
- Реализовать разрешение portable-каталога данных, SQLite connection factory, migrations, repositories и filesystem asset store.
- Реализовать root collection bootstrap и CRUD use cases.

**Exit:** все типы проходят round-trip tests; invariants и migration tests зелёные; пользовательская БД не пересоздаётся молча.
Expand Down Expand Up @@ -697,7 +712,7 @@ MVP MUST NOT включать:
### Phase 5 — Resident lifecycle and search

- Реализовать single-instance activation, global hotkey, show/hide, close-to-resident и explicit Exit.
- Реализовать settings и local secondary search.
- Реализовать форму настроек, выбор/безопасный перенос каталога данных, хранение всех прочих настроек в БД и local secondary search.
- Восстанавливать window placement и last collection.

**Exit:** повторная activation не создаёт второй workspace; hotkey стабильно управляет окном; поиск и restart проходят acceptance scenarios.
Expand Down Expand Up @@ -733,6 +748,9 @@ MVP принимается только если все следующие ут
13. SQLite foreign keys включены, migrations протестированы, assets лежат во filesystem по относительным app-owned paths.
14. Domain и integration test suites проходят; solution собирается без ошибок из документированного workflow.
15. Release build реально запускается на заявленной минимальной Windows version/configuration и показывает ожидаемый top-level window.
16. Распакованное приложение создаёт `content` рядом с `.exe`, сохраняет там БД и app-owned файлы и после переноса каталога приложения сохраняет рабочее пространство.
17. Каталог данных выбирается с документированным приоритетом CLI → ENV → JSON → default; невалидный путь не приводит к молчаливому созданию пустого рабочего пространства в другом месте.
18. Форма «Настройки» показывает текущий каталог и все пользовательские настройки. Смена каталога переносит БД и app-owned файлы без потери данных; при ошибке прежний каталог остаётся рабочим. Режим вида и остальные настройки хранятся в БД и восстанавливаются после перезапуска.

## 18. Definition of Done for every feature

Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

**Все ресурсы. Одно пространство.** Локальное приложение для Windows, в котором ссылки, файлы, папки, программы и заметки собраны в одном визуальном каталоге.

[English](docs/README.en.md) · [Запуск из исходников](docs/development.md) · [Устройство проекта](docs/architecture.md)
[English](docs/README.en.md) · [Сценарии пользователя](docs/user-stories.md) · [Запуск из исходников](docs/development.md) · [Устройство проекта](docs/architecture.md)

![Personal Resource Workspace — общий вид приложения](assets/personal-resource-workspace.png)

Expand All @@ -14,13 +14,16 @@
- **Быстрый доступ:** ищите по каталогу и сортируйте по названию или дате изменения. Открывайте ресурсы из карточки и редактируйте их через контекстное меню.
- **Простое добавление:** перетаскивайте файлы, папки и веб-ссылки в окно. При создании ресурса приложение может подставить содержимое буфера обмена.
- **Корзина:** случайно удалённый ресурс сначала попадает в корзину; её можно очистить отдельно.
- **Portable-данные:** новые сборки хранят базу и визуальные файлы в `content` рядом с приложением. В «Настройках» можно выбрать другой каталог; вид и сортировка сохраняются в БД.

Приложение находится в активной разработке. Скриншот показывает один из вариантов наполнения личного пространства; ваши данные и карточки будут другими.

## Попробовать

Скачайте [предварительную версию v0.1.1 для Windows x64](https://github.com/web2bear/PersonalResourceWorkspace/releases/tag/v0.1.1): распакуйте ZIP целиком и запустите `PersonalResourceWorkspace.App.exe`. Это переносимая версия без установщика и цифровой подписи. При желании проект можно [собрать из исходников](docs/development.md).

Версия v0.1.1 выпущена до реализации portable-хранения; описанное выше расположение `content` относится к текущему исходному коду и будущим сборкам.

## Идеи на будущее

Это направления развития, **не реализованные функции и не обещание сроков**:
Expand Down
2 changes: 2 additions & 0 deletions docs/adr/0001-unpackaged-deployment.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
- Status: Accepted
- Date: 2026-09-10

> Расположение пользовательских данных в этом ADR заменено [ADR 0003](0003-portable-data-and-settings.md). Текущий код использует portable-каталог `content` по умолчанию.

## Context

The contract prefers packaged deployment but explicitly allows unpackaged deployment when direct agent-driven executable launch is required. The official packaged template built successfully, but the audited sandbox cannot register a loose-layout MSIX: Windows deployment reports that the current token has no resolvable user-profile type (`0x80073D19`, inner `0x80070002`). Installing the signed Windows App Runtime also failed under the sandbox deployment API (`0x80070570`). Granting access to the package directories did not change the profile-token failure.
Expand Down
2 changes: 2 additions & 0 deletions docs/adr/0002-sqlite-and-filesystem-storage.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
- Status: Accepted
- Date: 2026-09-10

> Расположение пользовательских данных в этом ADR заменено [ADR 0003](0003-portable-data-and-settings.md). Текущий код использует portable-каталог `content` по умолчанию.

## Context

The application is local-first and must preserve structured metadata safely while keeping large binary images outside the database.
Expand Down
Loading
Loading